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 & $0print は、指定されたコンテンツを印刷する 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 fileBEGIN{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/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 詳細はこちらLinux awk コマンドに関する詳細な記事は、PHP 中国語 Web サイトに注目してください。
[root @localhostホーム]#猫テスト0