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/passwdawk -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 // 丸め 出力区切り文字 OFSawk '$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/passwdsmallsmallsmalllargesmallsmall 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 マリー 2143 78 84 77 ジャック 2321 66 78 45 トム 2122 48 77 71 マイク 2537 87 97 95 ボブ 2415 40 7 62
[root @localhostホーム]#猫テスト0