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のデフォルトの区切り文字はスペースなので、指定する必要はありません.
[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