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

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

高洛峰
高洛峰オリジナル
2016-12-15 10:38:511141ブラウズ

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と似ていますが、マルチファイルレコードは増加しません、各ファイルは1から始まります

Tタブレット、時間FS開始時にセパレータを定義します区切り文字の

RS 入力、これはデフォルトで行を変更します (つまり、テキストは 1 行ごとに入力されます)

~ 一致、== と比較すると正確ではありません 不正確な比較

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

!= 等しくありません、正確な比較

&& 論理 AND

|| 論理 OR

+ 1 つ以上を示します

/ [0-9][0-9]+/ 2 つまたは複数の数字

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

FILENAME ファイル名

OFS 出力フィールド区切り文字。デフォルトはスペースでもあり、タブ文字に変更できます。等

ORS 出力レコード区切り文字のデフォルトは改行文字、つまり処理結果も画面に一行ずつ出力されます

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

print & $0

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

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

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

Awk' {Print" a "} '/etc/etc/ Passwd / / 同じ数字の A 行を出力、1 行には A の文字が 1 つだけあります

AWK -F ":" '{Print $ 1}'/etc/passwd

-F: '{Print $ 1}; '/etc/passwd // テキスト行ごとの処理をさらに理解するために、各行の最初の 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."}' テスト

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 2 {Print $ 0}' /ETC/PASSWD // 1 行に 2 つ以上のフィールドがある行を表示します

awk '{print NR,$0}' /etc/passwd // それぞれの行番号を出力します。 line

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} '// 最初の行を表示しません

// 一致するコード ブロック

// 純粋な文字は一致しません ~ // フィールド値が一致します! ~ // フィールド値が一致するものと一致しません ~/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]*/{$ 0}'/etc/etcwd/etc/etswd〜/mail/{print $ 1} '/etc/etswd/ /$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<1{print $3}' 以上 /etc/ passwd //

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命令详解


詳細はこちらLinux awk コマンドに関する詳細な記事は、PHP 中国語 Web サイトに注目してください。

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