linuxでのawkの基本的な使用
20197 ワード
コア1、awk 2とは何か、awkの動作原理3、awkのオプション紹介4、基本使用5、演算子6、組み込み変数7、ケース
1、awk AWKとはテキストファイルを処理する言語であり、強力なテキスト分析ツールである.AWKと呼ばれるのは、創業者のAlfred Aho、Peter Weinberger、Brian KernighanのFamily Nameの頭文字を3人取ったからだ.
2、awkの動作原理awk‘BEGIN{commands}pattern{commands}END{commands}’第一歩:BEGIN{commands}文ブロックの文を実行する;ステップ2:ファイルまたは標準入力(stdin)から1行を読み出し、pattern{commands}文ブロックを実行します.ファイルがすべて読み込まれるまで、1行目から最後の行までファイルを1行ずつスキャンします.ステップ3:入力ストリームの最後に読み出されると、END{commands}文ブロックが実行されます.BEGIN文ブロックは、awkが入力ストリームからローを読み出す前に実行されます.これは、変数の初期化、出力テーブルのヘッダーの印刷などのオプションの文ブロックです.通常、BEGIN文ブロックに書くことができます.END文ブロックは、awkが入力ストリームからすべての行を読み出した後に実行されます.たとえば、すべての行の分析結果を印刷するなどの情報の要約は、END文ブロックで完了し、オプションの文ブロックでもあります.pattern文ブロックの汎用コマンドは最も重要な部分であり、オプションでもあります.pattern文ブロックが指定されていない場合、デフォルトでは{print}が実行されます.すなわち、読み込まれた各ローが印刷され、awkで読み込まれた各ローが文ブロックを実行します.
3、awkのオプション紹介awkの文法フォーマット
awk[オプションパラメータ]「script」var=value file(s)またはawk[オプションパラメータ]-f scriptfile var=value file(s)
オプションパラメータの説明
1、 -F fs or –field-separator fs
入力ファイル分割セパレータを指定します.fsは文字列または正規表現-Fなどです.
2、-v val=value or –asign var=value
ユーザー定義変数を付与します.Linuxでは通常${val}で変数を使用しますがawkはできません.-vで値を付与する必要があります.
3、-f scriptfile or –file scriptfile
スクリプトファイルからawkコマンドを読み込む
4、-mf nnn and -mr nnn
nnn値に内在的な制限を設定し、-mfオプションはnnnに割り当てられた最大ブロック数を制限します.-mrオプションは記録の最大数を制限し、この2つの機能はbell実験室版awkの拡張機能であり、標準awkでは適用されません.
5、-W compact or –compat,-W traditional or –traditional
互換モードでawkを実行するため、gawkの動作は標準のawkと同様に、すべてのawk拡張は無視されます.
6、-W copylefe or –copyleft ,-W copyright or –copyright
簡単な著作権情報の印刷
7、 -W help or –help ,-W usage or –usage
すべてのawkオプションと各オプションの簡単な説明を印刷
8、-W lint or –lint
従来のunixプラットフォームに移植できない構造のアラートを印刷
9、-W lint-old or –lint-old
従来のunixプラットフォームに移植できない構造に関するアラートを印刷
10、-W posix
互換モードを開きますが、/x、関数キー、func、トランスコードシーケンス、およびfsがスペースの場合、新しい行をドメインセパレータとして識別しない制限があります.オペレータ**と**=は^と^=に代わることはできません.無効なfflush
11、-W re-interval or –re-inerval
かっこ式[[:alpha:]]のような間隔正規表現の使用を許可する
12、-W source program-text or –source program-text
ソースコードとしてprogram-textを使用し、-fコマンドと混用
13 -W version or –version
情報バージョンの印刷
4、基本的にlogを使う.txtテキストの内容は以下の通りです:bigdata hadoop spark storm java scala c++shell python,cpython,Ppython,jpython
使用法1:awk'{[pattern]action}'{filenames}#行一致文awk"は単一引用符のみ使用できます
インスタンスは、スペースまたはtabキーで区切られ、最初の列と4番目の列の値が出力されます.ここでawkのデフォルトの区切り文字はスペースなので、指定する必要はありません.
使用法2:awk-F#-Fは内蔵変数FSに相当し、分割文字を指定する
#複数の区切り文字を使用します.スペース分割を使用してから、分割結果を使用します.
使用法3:awk-v#設定変数
使用法四awk-f{awkスクリプト}{ファイル名}
5、演算子
ケース
注:><文字列として比較したり、数値比較として使用したりすることができます.重要な操作数は文字列であれば文字列比較に変換されます.どちらも数字で数値比較に変わります.文字列比較:ASCIIコード順で比較します.
正規表現、第1列にbig単語を含む行、第1列と第2列~マッチングモードの開始//マッチングが必要なモードを表す
6、組み込み変数
7、ケースにはファイルsorceがあります.txtには各学生の点数情報が入っており、現在は各学生の総成績と平均成績を統計する必要がある.
他のケースでは、ディレクトリの下にあるファイルの合計サイズを統計します.
統計行の長さが20より大きいレコード
1、awk AWKとはテキストファイルを処理する言語であり、強力なテキスト分析ツールである.AWKと呼ばれるのは、創業者のAlfred Aho、Peter Weinberger、Brian KernighanのFamily Nameの頭文字を3人取ったからだ.
2、awkの動作原理awk‘BEGIN{commands}pattern{commands}END{commands}’第一歩:BEGIN{commands}文ブロックの文を実行する;ステップ2:ファイルまたは標準入力(stdin)から1行を読み出し、pattern{commands}文ブロックを実行します.ファイルがすべて読み込まれるまで、1行目から最後の行までファイルを1行ずつスキャンします.ステップ3:入力ストリームの最後に読み出されると、END{commands}文ブロックが実行されます.BEGIN文ブロックは、awkが入力ストリームからローを読み出す前に実行されます.これは、変数の初期化、出力テーブルのヘッダーの印刷などのオプションの文ブロックです.通常、BEGIN文ブロックに書くことができます.END文ブロックは、awkが入力ストリームからすべての行を読み出した後に実行されます.たとえば、すべての行の分析結果を印刷するなどの情報の要約は、END文ブロックで完了し、オプションの文ブロックでもあります.pattern文ブロックの汎用コマンドは最も重要な部分であり、オプションでもあります.pattern文ブロックが指定されていない場合、デフォルトでは{print}が実行されます.すなわち、読み込まれた各ローが印刷され、awkで読み込まれた各ローが文ブロックを実行します.
3、awkのオプション紹介awkの文法フォーマット
awk[オプションパラメータ]「script」var=value file(s)またはawk[オプションパラメータ]-f scriptfile var=value file(s)
オプションパラメータの説明
1、 -F fs or –field-separator fs
入力ファイル分割セパレータを指定します.fsは文字列または正規表現-Fなどです.
2、-v val=value or –asign var=value
ユーザー定義変数を付与します.Linuxでは通常${val}で変数を使用しますがawkはできません.-vで値を付与する必要があります.
3、-f scriptfile or –file scriptfile
スクリプトファイルからawkコマンドを読み込む
4、-mf nnn and -mr nnn
nnn値に内在的な制限を設定し、-mfオプションはnnnに割り当てられた最大ブロック数を制限します.-mrオプションは記録の最大数を制限し、この2つの機能はbell実験室版awkの拡張機能であり、標準awkでは適用されません.
5、-W compact or –compat,-W traditional or –traditional
互換モードでawkを実行するため、gawkの動作は標準のawkと同様に、すべてのawk拡張は無視されます.
6、-W copylefe or –copyleft ,-W copyright or –copyright
簡単な著作権情報の印刷
7、 -W help or –help ,-W usage or –usage
すべてのawkオプションと各オプションの簡単な説明を印刷
8、-W lint or –lint
従来のunixプラットフォームに移植できない構造のアラートを印刷
9、-W lint-old or –lint-old
従来のunixプラットフォームに移植できない構造に関するアラートを印刷
10、-W posix
互換モードを開きますが、/x、関数キー、func、トランスコードシーケンス、およびfsがスペースの場合、新しい行をドメインセパレータとして識別しない制限があります.オペレータ**と**=は^と^=に代わることはできません.無効なfflush
11、-W re-interval or –re-inerval
かっこ式[[:alpha:]]のような間隔正規表現の使用を許可する
12、-W source program-text or –source program-text
ソースコードとしてprogram-textを使用し、-fコマンドと混用
13 -W version or –version
情報バージョンの印刷
4、基本的にlogを使う.txtテキストの内容は以下の通りです:bigdata hadoop spark storm java scala c++shell python,cpython,Ppython,jpython
使用法1:awk'{[pattern]action}'{filenames}#行一致文awk"は単一引用符のみ使用できます
インスタンスは、スペースまたはtabキーで区切られ、最初の列と4番目の列の値が出力されます.ここでawkのデフォルトの区切り文字はスペースなので、指定する必要はありません.
[root@SZB-L0032013 awk]# awk '{print $1,$4}' log.txt
bigdata storm
java C++
shell
[root@SZB-L0032013 awk]# awk '{printf "%-8s %-10s
",$1,$4}' log.txt
bigdata storm
java C++
shell
使用法2:awk-F#-Fは内蔵変数FSに相当し、分割文字を指定する
# ","
[root@SZB-L0032013 awk]# awk -F, '{print $1,$2}' log.txt
bigdata hadoop spark storm
java scala c C++
shell python cpython
# , BEGIN
[root@SZB-L0032013 awk]# awk 'BEGIN{FS=","} {print $1,$2} ' log.txt
bigdata hadoop spark storm
java scala c C++
shell python cpython
#複数の区切り文字を使用します.スペース分割を使用してから、分割結果を使用します.
[root@SZB-L0032013 awk]# awk -F '[ ,]' '{print $1,$2,$5}' log.txt
bigdata hadoop
java scala
shell python jpython
使用法3:awk-v#設定変数
[root@SZB-L0032013 awk]# awk -v a=1 '{print a+1,$1}' log.txt
2 bigdata
2 java
2 shell
[root@SZB-L0032013 awk]# awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
bigdata 1 bigdatas
java 1 javas
shell 1 shells
使用法四awk-f{awkスクリプト}{ファイル名}
$ awk -f cal.awk log.txt
[root@SZB-L0032013 awk]# cat awk.file
#!/bin/awk -f
-F " " {print $1}
[root@SZB-L0032013 awk]# awk -f awk.file log.txt
bigdata
java
shell
5、演算子
= += -= *= /= %= ^= **=
?: C
||
&&
~ ~!
< <= > >= != ==
+ - ,
* / % ,
+ - ! ,
^ ***
++ -- ,
$
in
ケース
[root@SZB-L0032013 awk]# awk '{print $1}' log.txt
bigdata
java
shell
[root@SZB-L0032013 awk]# awk '$1=="shell" || $1=="java" {print $1}' log.txt
java
shell
[root@SZB-L0032013 awk]# awk '{print $1}' log.txt
bigdata
java
shell
[root@SZB-L0032013 awk]# awk '$1>"c" {print $1}' log.txt
java
shell
注:><文字列として比較したり、数値比較として使用したりすることができます.重要な操作数は文字列であれば文字列比較に変換されます.どちらも数字で数値比較に変わります.文字列比較:ASCIIコード順で比較します.
[root@SZB-L0032013 awk]# awk 'BEGIN{a="b";print a=="b"? "true":"false";}'
true
[root@SZB-L0032013 awk]# awk 'BEGIN{a="b";arr[0]="a";arr[1]="c";print(a in arr)}'
0
[root@SZB-L0032013 awk]# awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print(a in arr)}'
1
正規表現、第1列にbig単語を含む行、第1列と第2列~マッチングモードの開始//マッチングが必要なモードを表す
[root@SZB-L0032013 awk]# awk '$1 ~ /big/ {print $1,$2}' log.txt
bigdata hadoop
[root@SZB-L0032013 awk]# cat log.txt
bigdata hadoop spark storm
java scala c C++
shell python,cpython,Ppython,jpython
# shell , grep
[root@SZB-L0032013 awk]# awk '/shell/' log.txt
shell python,cpython,Ppython,jpython
#
[root@SZB-L0032013 awk]# awk ' !/hadoop/' log.txt
java scala c C++
shell python,cpython,Ppython,jpython
Hadoop drill hive
[root@SZB-L0032013 awk]# awk '$1 !~ /big/ {print $1,$2}' log.txt
java scala
shell python,cpython,Ppython,jpython
Hadoop drill
6、組み込み変数
\$n n , FS
\$0
ARGC
ARGIND ( 0 )
ARGV
CONVFMT ( %.6g)ENVIRON
ERRNO
FIELDWIDTHS ( )
FILENAME
FNR NR,
FS ( )
IGNORECASE ,
NF
NR
OFMT ( %.6g)
OFS ( )
ORS ( )
RLENGTH match
RS ( )
RSTART match
SUBSEP ( /034)
[root@SZB-L0032013 awk]# awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s
","FILENAME","FNR","FS","NF","NR","ARGC","ARGIND
";printf "-------------------------------------------------
"}{printf "%4s %4s %4s %4s %4s %4s %4s
",FILENAME,FNR,FS,NF,NR,ARGC,ARGIND}' log.txt
FILENAME FNR FS NF NR ARGC ARGIND
-------------------------------------------------
log.txt 1 4 1 2 1
log.txt 2 4 2 2 1
log.txt 3 2 3 2 1
[root@SZB-L0032013 awk]# awk -F "=" 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s
","FILENAME","FNR","FS","NF","NR","ARGC","ARGIND
";printf "-------------------------------------------------
"}{printf "%4s %4s %4s %4s %4s %4s %4s
",FILENAME,FNR,FS,NF,NR,ARGC,ARGIND}' log.txt
FILENAME FNR FS NF NR ARGC ARGIND
-------------------------------------------------
log.txt 1 = 1 1 2 1
log.txt 2 = 1 2 2 1
log.txt 3 = 1 3 2 1
[root@SZB-L0032013 awk]# awk '{print NR,FNR,$1,$2,$3}' log.txt
1 1 bigdata hadoop spark
2 2 java scala c
3 3 shell python,cpython,Ppython,jpython
[root@SZB-L0032013 awk]# awk '{print NR,FNR,$1,$2,$3}' OFS="$" log.txt
1$1$bigdata$hadoop$spark
2$2$java$scala$c
3$3$shell$python,cpython,Ppython,jpython
[root@SZB-L0032013 awk]# awk 'BEGIN{IGNORECASE=1} /hadoop/' log.txt
bigdata hadoop spark storm
Hadoop drill hive
[root@SZB-L0032013 awk]# awk '/hadoop/' log.txt
bigdata hadoop spark storm
7、ケースにはファイルsorceがあります.txtには各学生の点数情報が入っており、現在は各学生の総成績と平均成績を統計する必要がある.
[root@SZB-L0032013 awk]# cat sorce.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
[root@SZB-L0032013 awk]# cat awk.file
#!/bin/awk -f
#BEGIN
BEGIN{
FS=" "
math=0
english=0
computer=0
printf "NAME NO. MATH ENGLISH COMPUTER TOTAL
"
printf "-----------------------------------------------
"
}
#cal
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-4s %8d %8d %8d %8d
",$1,$2, $3,$4,$5, $3+$4+$5
}
#END
END{
printf "-----------------------------------------------
"
printf "TOTAL: 10%d %8d %8d
",math,english,computer
printf "AVG: 10.2%d %8.2d %8.2d
",math/NR,english/NR,computer/NR
}
[root@SZB-L0032013 awk]# awk -f awk.file sorce.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: 10319 393 350
AVG: 10.263 78 70
他のケースでは、ディレクトリの下にあるファイルの合計サイズを統計します.
[root@SZB-L0032013 ProCAppnt]# ls -l *.txt|awk 'BEGIN{FS=" "} {sum+=$5} END{print sum/1024/1024"MB"}'
1032.93MB
統計行の長さが20より大きいレコード
[root@SZB-L0032013 awk]# awk 'length>20' log.txt
bigdata hadoop spark storm
shell python,cpython,Ppython,jpython