Latest web development tutorials

、Linuxのawkコマンド

、Linuxのawkコマンド

LinuxのコマンドDaquanの LinuxのコマンドDaquanの

AWKは、テキスト分析が強力なツールである、言語処理テキストファイルです。

それは3創設者アルフレッド・アホ、ピーター・ワインバーガー、最初の文字のファミリ名のブライアン・カーニハンを取ったので、AWKが呼び出されました。

文法

awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

オプションのパラメータ説明:

  • -F Fsのか--field区切りFS
    入力セパレーターをオフにファイルを指定し、FSは、-Fとして、文字列または正規表現です:。
  • -v VAR =値または--asign VAR =値
    ユーザ定義の変数を割り当てます。
  • -f scripfileまたは--fileスクリプトファイル
    awkコマンドは、スクリプトファイルから読み込みます。
  • -mf NNNと-mr NNN
    固有の限界のNNNの値は、ブロックの最大数が割り当てられ-mfオプションの制限をnnnは、オプションは、レコード-mr最大数を制限します。 これら2つの機能は適用されません標準のawkでのawkの拡張子のベル研究所バージョンです。
  • -Wコンパクトまたは--compat、伝統的な-Wまたは--traditional
    互換モードのawkで実行されています。 だから行動とまったく同じ標準のawk、awkのすべての拡張機能が無視されgawkは。
  • -Wコピーレフトまたは--copyleft、-W著作権や--copyright
    簡単な著作権情報を表示します。
  • -Wヘルプまたは--help、-W使用または--usage
    awkのオプションおよび各オプションのすべての短い説明を表示します。
  • -Wリントまたは--lint
    ない伝統的なUNIXの移植の構造に印刷警告。
  • -Wリント古いまたは--lint-古いです
    印刷は、従来のUNIXプラットフォームの構造の警告へ移植することはできません。
  • -WのPosix
    互換モードをオンにします。 以下の制限が、認識しない:、ファンクションキーは、FUNC、シーケンスをXエスケープ/、およびfsはスペース、フィールドセパレータとして新しいラインです;演算子**と** = ^と交換することはできません^ =;無効のfflush。
  • -W再間隔または--re-inerval
    定期的な使用でのインターバル表現を可能にする、このようなブラケット式として参照(POSIX文字クラス内のgrep)、[[:アルファ:]]。
  • -Wソースプログラムテキストや--sourceプログラムテキスト
    それは-fコマンドを使用して混合することができ、ソースコード等のプログラムのテキストを使用します。
  • -Wバージョンまたは--version
    情報を報告印刷版のバグ。

基本的な使用法

次のようにlog.txtというテキストが読み取ります。

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

使用します。

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

例:

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 

使用法II:

awk -F  #-F相当于内置变量FS, 指定分割字符

例:

# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

3を使用します。

awk -v  # 设置变量

例:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

4を使用します。

awk -f {awk脚本} {文件名}

例:

 $ awk -f cal.awk log.txt

演算子

演算子 説明
= + = - = * = / =%= ^ = ** = 割り当て
?: C条件式
|| 論理的または
&& 論理と
~~! 正規表現に一致しない正規表現に一致
<< = >> =!= == 関係演算子
ブランク 接続
+ - 加算、減算
* /& 乗算、除算、剰余
+ - ! 単項プラス、マイナス、および論理否定
^ *** 累乗法
++ - 接頭辞または接尾辞として、増加または減少
$ フィールド参照
アレイメンバー

行の最初の列のフィルタリングは2よりも大きいです

$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

行の最初の列のフィルタリング2等号

$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is

2より大きい列は1行2列に等しくされているフィルタリングの 'は'

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you

組み込み変数

変数 説明
\ $ N フィールド間のFSで区切られた現在のレコードのN番目のフィールド、
\ $ 0 完全な入力レコード
ARGC コマンドラインパラメータの数
ARGIND 現在のファイルのコマンドライン上の位置(0からカウント開始)
ARGV アレイは、コマンドライン引数が含まれています
CONVFMT ENVIRON環境変数の連想配列デジタル変換フォーマット(デフォルトは%の0.6グラムです)
ERRNO 最後に、システムエラーの説明
FIELDWIDTHS フィールドリストの幅(スペースで区切ります)
FILENAME 現在のファイル名
FNR NRとが、現在のファイルへの相対
FS フィールドセパレータ(デフォルトは空白です)
IGNORECASE trueの場合、大文字と小文字を区別しないマッチ
NF 現在のレコードのフィールド数
NR レコードの現在の数
OFMT デジタル出力フォーマット(デフォルトは%の0.6グラムです)
OFS 出力フィールドセパレータ(デフォルトはスペースです)
ORS 出力レコードセパレータ(デフォルトは改行です)
RLENGTH マッチファンクション文字列によって試合の長さ
RS レコードセパレータ(デフォルトは改行です)
RSTART 最初の位置はマッチファンクション文字列と一致します
SUBSEP 配列添字の区切り(デフォルトは/ 034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1         5    1
log.txt    2    2         5    2
log.txt    2    3         3    3
log.txt    2    4         4    4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1    '    1    1
log.txt    2    2    '    1    2
log.txt    2    3    '    2    3
log.txt    2    4    '    1    4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

通常の文字列マッチングを使用します

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

〜の概略が開始されます。//モードです。

# 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

大文字小文字を区別しません

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

モード否定

$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

awkスクリプト

awkスクリプトについて、私たちは、BEGINとEND 2のキーワードに注意を払う必要があります。

  • BEGIN {文を実行する前に、そこに置かれています}
  • END {これが実行されるように処理した後、すべての行を入れ文です}
  • {これは、行ごとに実行されるステートメントを置く方法です}

そのような文書(生徒の成績表)と想定します。

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

私たちのawkスクリプトを次のように

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

私たちは、結果の実装を見てみましょう。

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

さらなる例

AWKはハロー世界のプログラムです:

BEGIN { print "Hello, world!" }

ファイルサイズの計算

$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581

ライン80の長さよりも大きいファイルから検索するには

awk 'lenght>80' log.txt

印刷九九

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

より詳細な情報を閲覧することができAWKの公式マニュアル: http://www.gnu.org/software/gawk/manual/gawk.html

LinuxのコマンドDaquanの LinuxのコマンドDaquanの