ホームページ  >  記事  >  php教程  >  Linuxのawkコマンドの詳しい説明

Linuxのawkコマンドの詳しい説明

高洛峰
高洛峰オリジナル
2016-12-12 16:14:301247ブラウズ

awkはラインプロセッサです: 画面処理の利点と比較して、巨大なファイルを処理するときにメモリオーバーフローや処理速度の問題が発生しません。通常はテキスト情報をフォーマットするために使用されます

awk処理プロセス: 各行を順番に処理します。そして、

awk コマンド形式を出力します:

awk [-F|-f|-v] 'BEGIN{} //{command1; END{}' file

[-F|-f|-v] ] 大きなパラメータ、-F は区切り文字を指定、-f はスクリプトを呼び出し、-v は変数を定義します var=value

' ' ' コード ブロックの引用

BEGIN コード ブロックを初期化します。各行を処理する前に、コードを初期化します。 、主にグローバル変数を参照し、FS 区切り文字を設定します

// 一致するコード ブロック (文字列または正規表現にすることができます)

{} 1 つ以上のコマンドを含むコード ブロック、コード

;各行の処理後に実行されるブロック。主に最終計算を実行するか、終了概要情報を出力します

特別な点:

$0 現在の行全体を表します

$1 各行の最初のフィールド

NFフィールド番号変数

NR ‐ ' s

t- t を 1 つの改行文字に 時間 FS 開始時に、区切り文字の区切り文字を定義します

RS 入力。デフォルトでは行が変更されます (つまり、テキストは 1 つに従って入力されます)行と行)

~ 一致、== と比較すると正確ではない 不正確な比較

== 等しい、すべてが等しい必要がある、正確な比較

!= 等しくない、正確な比較

&& 論理 AND

||

+ 1つ以上を表します

/ [0-9][0-9]+/ 2つ以上の数字

/[0-9][0-9]*/ 1つ以上の数字

FILENAME ファイル名

OFS 出力フィールド区切り文字、デフォルトはスペースでもあり、タブ文字などに変更可能

ORS 出力レコード区切り文字はデフォルトで改行文字、つまり処理結果も画面を 1 行ずつ

-F'[:#/]' 3 つ定義します 区切り文字

print & $0

print は、指定されたコンテンツを印刷する awk のメインコマンドです

awk '{print}' /etc /passwd == awk '{print $0}' /etc/passwd

awk '{ Print "} '/ETC/PASSWD // Passwd コンテンツを出力しませんが、同じ数の空行を出力します。これは、AWK がテキストの処理の行です

wk '{print "A"}'/etc/etc/passwd/etc/etswd //各行の最初の2つのフィールドを別の行に出力して、行ごとのテキストの処理をさらに理解します

awk -F: '{print $1,$3,$6}' OFS="t" /etc/passwd 出力フィールド 1、3、6、区切り文字としてタブ文字を使用

-f はスクリプト ファイルを指定します

awk -f script.awk file

BEGIN{

FS=":"

}

{ print $1} //効果は awk -F":" '{print $1} と同じです'、それを除いて区切り文字は、FS

awk 'BEGIN{X=0} /^$/{ X+= 1 } END{print "I find",X,"blank Lines."}' test を使用してコード自体で指定されます

4 つの空白行を見つけました。

ls -l|awk 'BEGIN{sum=0} !/^d/{sum+= $5} END{print "合計サイズは",sum}' // ファイルサイズを計算します

合計サイズは17487です

-Fは区切り文字を指定します

$1は区切り文字を指定した後の最初のフィールド、$3は3番目のフィールド、tはタブ文字です

1つ以上の連続するスペースまたはタブは区切り文字とみなされます、つまり、複数のスペースはスペースとみなされます

awk -F":" '{print $1}' /etc/passwd

awk -F":" '{print $1 $3}' /etc/passwd //$1と$3を分離せずに連結して出力​​します

awk -F ":" '{print $1,$3}' /etc/passwd // 余分なカンマがあり、$1 と $3 はスペースで区切られています

awk -F" '{print $1 " " $3}' / etc /passwd の間にスペースを入れて使用します。スルースルースルー ' s ‐ ‐ ‐ ‐ ‐ ‐ ‐ -F: '{print NF}' / etc/passwd出てくる

AWK -F: 'NF == 4 {Print}'/ETC/PASSWD // フィールドが 4 つだけある行を表示

AWK -F: 'NF & GT; }'/ETC/PASSWD // 1 行に 2 つ以上のフィールドがある行を表示します

awk '{print NR,$0}' /etc/passwd // 行番号を出力する各行の

awk -F: '{print NR,NF,$NF,"t ",$0}' /etc/passwd //行番号、フィールド番号、最後のフィールド値、タブ文字、各行の内容を順番に出力します

awk -F: 'NR ==5{print}' /etc/passwd / /5行目を表示

awk -F: 'NR==5 || NR==6{print}' /etc/passwd //5行目と6行目を表示

route -n|awk 'NR! = 1 {Print} '// 最初の行を表示しません

// コードブロックに一致します

// 純粋な文字は一致しません ~ // フィールド値matching! ~ // フィールド値は一致しません matching ~/a1|a2/フィールド値は a1 または a2 と一致します

awk '/mysql/' /etc/passwd

awk '/mysql/{print }' /etc/passwd

awk '/mysql/{print $0} '/etc/passwd // 3つの命令は

Awkと同じです'!/MySQL/{Print $0} '/etc/passwd // mysqlの行と一致せずに出力します

Awk'/mysql | MAIL/{Print} '/etc/passwd

awk '!/mysql|mail/{print}' /etc/passwd

awk -F: '/mail/,/mysql/{print } '/etc/passwd // intervalmatching

awk'/[2] [7] [7]*/{print $ 0} '/etc/passwd/etc/passwd〜/mail/{print $ 1}'/etc /passwd //$1は指定した内容と一致する場合のみ表示されます

awk -F: '{if($1~/mail/) print $1}' /etc/passwd //上と同じ

awk -F: '$1​​!~/mail/{print $1}' /etc/passwd //一致しません

awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd

IFステートメント

は{}内で使用する必要があり、比較内容は()で展開されます

awk -F: '{if($1~/mail/) print $1}' /etc/passwd

awk -F: ' {if($1~/mail/) {print $1}}' /etc/passwd else {print $2}}' /etc/passwd //if...else...

条件式

== != > >=

awk -F":" ' $1=="mysql"{print $3}' /etc/passwd

awk -F":" '{if($1=="mysql ") print $3}' /etc/passwd //上記と同じ

awk -F":" '$1!="mysql"{print $3}' /etc/passwd //

awk -F":" '$3>=100{print $3}' /etc/passwd より大きい//

awk -F":" '$3

AWK -F より小さい ":" '$ 3 & lt; Print $ 3}'/etc/passwd //

論理演算子 & && ||

AWK -F: ' $1~/mail/ && $3>8 {print }' /etc/passwd //論理 AND、$1 は mail と一致し、$3>8

awk -F: '{if($1~/mail/ && $3> ;8) print }' /etc/passwd

awk -F: '$1~/ mail/ || $3>1000 {print }' /etc/passwd //論理和

awk -F: '{if( $1~/mail/ || $3>1000) print }' /etc/passwd

数値演算

awk -F: '$3 > 100' /etc/passwd

awk -F: '$3 > 100 ||

awk -F: ' $3+$4 > 200' /etc/passwd

awk -F: '/mysql|mail/{print $3+10}' /etc/passwd using 10 use with 10 to be added to ' ' /mysql /{print $3 *$4}' /etc/passwd 1024)}' /proc/meminfo // 丸め

出力区切り文字 OFS

awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5, $6}' OFS="t" netstat.txt

awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txt

//出力WAITに一致するフィールド6行、各行が出力 行番号、フィールド4、5、6、フィールド区切りはタブで

処理結果をファイルに出力

① コマンドコードブロックルートに直接出力-n|awk 'NR!=1{print > "./fs"}'

②出力にリダイレクトを使用する‐ ‐ ‐ n|‐awk 'NR!=1{print}' ‐ printf "%-8s % -8s %-10sn",$1,$2,$3}'

printf はフォーマット出力を表します

% フォーマットされた出力区切り文字

-8 は長さ 8 文字です

s は文字列タイプを表します

それぞれの最初の 3 つのフィールドを出力します行で、最初のフィールドに文字列型を出力する(長さは8)、2番目のフィールドに文字列型を出力する(長さは8)、

3番目のフィールドに文字列型を出力する(長さは10)

netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s n",$1,$2,$3}'

netstat - anp|awk '$6== "LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s n",NR,$1,$2,$3}'

IF ステートメント

awk -F: '{ if($3>100) print "large"; else print "small"}' /etc/passwd

small

small

small

large

small

small

awk -F: 'BEGIN{ A=0;B=0} {if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A,"t", B}' /etc/passwd

// 100 未満の場合はスキップ、それ以外の場合は表示

awk -F: 'BEGIN{i=1} {if(i

awk -F: 'BEGIN{i=1} {if(i

另一形式

awk -F: '{print ($3>100 ? "yes":"no")}' /etc/passwd

awk -F: '{print ($3>100 ? $3":tyes":$3":tno")}' /etc/passwd

while语

awk -F: 'BEGIN{i=1 } {while(i

7 root 1

7 x 2

7 0 3

7 0 4

7 root 5

7 / root 6

数组

netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) print i,"t",a[i]}'

netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%-20s %-10s %-5s n", i,"t",a[i] }'

9523 1 6

7903 1

3038/cupsd 1

791 3 1

10837 1 1

应用1

awk -F: '{ print NF}' helloworld.sh //输出文件每行有何字段

awk -F: '{print $1,$2,$3,$4,$5}' helloworld.sh //输出前5个字段

awk - F: '{print $1,$2,$3,$4,$5}' OFS='t' helloworld.sh //输出前5个字段并使用制表符分隔输出

awk -F: '{print NR,$1 ,$2,$3,$4,$5}' OFS='t' helloworld.sh //制表符分输出前5个字段,并打印行号

应用2

awk -F'[:#] '' {print nf} 'Helloworld.sh // ,$7}' OFS='t' helloworld.sh //制表符分断输出多字段

应用3

awk -F'[:#/]' '{print NF}' helloworld.sh //指定三分隔符,并输出每行字段数

awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12 }' helloworld.sh //制表符分隔输出多字段

应用4

计算/home目录下,普通文件的大小,单位

ls -l|awk 'BEGIN{sum=0 } !/^d/{sum+=$5} END{print "合計サイズは:",sum/1024,"KB"}'

ls -l|awk 'BEGIN{sum=0} !/^d/{ sum+=$5} END{print "合計サイズは:",int(sum/1024),"KB"}' //int は取整的意思

应用5

统计netstat -anp 状態态 forLISTEN和CONNECT の接続数はそれぞれいくらです

netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s n ", i," ",sum[i]}'

应用6

统计/home目录下の異用户的普通文件の总数は何ですか?

ls -l|awk 'NR!=1 && ! /^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s n",i," ",sum[i]}'

mysql 199

root 374

统计/home目录下の異なる用户の普通文件の大小总サイズはどのくらいですか?

ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END {for (i in sum) printf "%-6s %-5s %-3s %-2s n",i," ",sum[i]/1024/1024,"MB"}'

アプリケーション 7

出力スコアテーブル

awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno. Name No. Math English Computer Totaln";printf "------ - ------------------------------------------------- - --n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s n",NR,$1,$2 , $3,$4,$5,$3+$4+$5} END{printf "--------------------------------- - -------------------------n";printf "%-24s %-7s %-9s %-20s n","合計: ", math,eng,com;printf "%-24s %-7s %-9s %-20s n","Avg:",math/NR,eng/NR,com/NR}' test0


[root @localhostホーム]#猫テスト0

マリー 2143 78 84 77

ジャック 2321 66 78 45

トム 2122 48 77 71

マイク 2537 87 97 95

ボブ 2415 40 7 62

Linuxのawkコマンドの詳しい説明

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。