詳細] Linuxのawkコマンドを回し

オリジナルリンク:  http://blog.chinaunix.net/uid-23302288-id-3785105.html

awkはラインプロセッサである :スクリーン処理に比べて利点は、大きなファイルを扱う際には、通常のテキスト情報をフォーマットするために使用され、遅いのメモリや処理の問題のうち、表示されません。
AWKプロセス:  各行を順次処理し、その後出力
awkコマンドの形式:
awkの[-F | -f | -v]「{BEGIN} // {Command1を。Command2を} END {}」ファイル
 [-F | -f | -v]    :  大規模なパラメータ、スクリプトを呼び出し-f区切り文字を指定し、-v変数var =値を定義します-F
「」            参照ブロック
BEGIN     各行、初期化コードを処理する前に、初期化コードブロックは、主にグローバル変数は、セパレータがFS設けられている、使用され
@             マッチングブロックは、文字列または正規表現かもしれ
{}             コマンド・コード・ブロックは、1つ以上のコマンドを含んでいます
;            セミコロンで区切られた複数のコマンド
END        ブロックの終わり、再び実行される行処理後の各コードブロックは、主に、最終的なダイジェスト情報や出力の終了を算出します
 
特別なポイント:
$ 0            現在の行全体を表し
$ 1            最初のフィールドの各ライン
NFの           変数の数をフィールド
NR           各行のレコードの数、マルチファイル記録インクリメント
FNR         およびNR似ていますが、より多くのドキュメントは最初から各ファイルをインクリメントされていません
\ T             タブ
\ N-            改行
FS           区切り文字の定義を開始
RS     入力レコードセパレータ、改行デフォルト(すなわち、ライン毎、テキスト入力が基づいています)    
〜             マッチングは、比較は==と比較して、正確ではありません
!〜            一致しない場合、不正確な比較
==          等しい、すべて等しく、正確な比較でなければなりません
!=            等しくない、正確な比較
&&       論理と
||              論理的か
+             マッチは、少なくとも一つを示しています
/ [0-9] [0-9] + /    二つ以上のデジタル
/ [0-9] [0-9] * /     1つ以上のデジタル
FILENAME  ファイル名
OFS       出力フィールドセパレータ、デフォルトではスペース、タブなどにあります
ORS         出力レコード区切り、改行デフォルト、すなわち、処理結果は、ラインによってスクリーン線に出力されます。
-F '[:#/]'    3つの区切り文字の定義
 
プリント&$ 0
印刷  指定された印刷コマンドのawkのメインコンテンツです
AWK '{印刷}' / etc / passwdファイル== AWK '{$ 0印刷}' / etc / passwdファイル  
AWK「{印刷 『』}」/ etc / passwdファイル// passwdのコンテンツ線によって出力されないが、空白行の同じ数の出力、及びさらに説明するAWKプロセステキスト行を行い
AWK '{印刷 "A"}' / etc / passwdファイル//出力ラインの同じ数、文字の一つだけライン
awkの-F ":" '{$ 1印刷}' / etc / passwdファイル 
AWK -Fは:「{$ 1印刷; $ 2印刷}」/ etc / passwdファイル//各列の最初の2つのフィールド、出力ブランチは、さらにテキストのラインによって処理ラインが理解されます
awkの-F: '{$ 1、$ 3 $ 6印刷}' OFS = "\ tの" / etc / passwdファイル// 1,3,6出力フィールド、区切り文字としてタブ
 
-fスクリプトファイル指定
awkの-f script.awkファイル
ベギン{
FS = ":"
}
//効果は-F awkは{$ 1}プリント ":" 同じ '{$ 1印刷}'、コード自体に指定された区切りFSを除きます
 
AWK '{ "私が見つける"、X、 "空白行を" 印刷} {X = 0} / ^ $ / {X + = 1} ENDをBEGIN' 試験 
私は4つの空白行を見つけます。
 LS -l | awkは '!BEGIN {合計= 0} / ^ D / {合計+ = $ 5} END {印刷は、合計 "合計サイズがある"}' //ファイルサイズの計算
合計サイズは17487です
 
区切り文字を指定-F
$ 1は、第1のフィールドの後に指定された区切り文字、3 $ 3番目のフィールドは、\ Tタブであることを意味し
即ち空間複数の空間として見デリミタとして見られる一つ以上の連続スペースまたはタブ、
awkの-F ":" '{$ 1印刷}' / etc / passwdファイル
awkの-F ":" '{印刷$ 1 $ 3}' / etc / passwdファイル// $ 1、パーティションなしの出力に接続された$ 3
AWKの-F ":" '{$ 3 $ 1印刷}' / etc / passwdファイル//コンマよりも、$ 1とスペースで区切られた$ 3
awkの-F ":" '{ "" $ 3 $ 1印刷}' / etc / passwdファイル// $ 1と$ 3パーティション間で、手動でスペースを追加
awkの-F ":" '{印刷 "ユーザー名:" $ 1 "\ T \ T Uidの:" $ 3}' / etc / passwdファイル//カスタム出力  
AWK -F:の/ etc '{NFを印刷}' / passwdの//行ごとに表示されるフィールドの数を
AWK -F:NF印刷された線の各フィールドの '{印刷$ NF}' / etc / passwdファイル//値
 AWK -F: 'NF == 4 {印刷}' / etc / passwdファイル//表示ラインのみ四つのフィールド
AWK -Fは: 'NF>は2 {$ 0印刷}' / etc / passwdファイル//フィールド当たりのライン数が行2より大きい示します
各行のAWK '{印刷NR、$ 0}' / etc / passwdファイル//出力行数
awkの-F: '{印刷NR、NF、$ NF、 "\トン"、$ 0}' / etc / passwdファイル//プリントラインの注文番号、フィールド、フィールド値と最終的には、タブの数、各ライン
awkの-F: 'NR == 5 {印刷}' / etc / passwdファイル//表示行5
AWK -F: 'NR == 5 || NR == 6 {印刷}' / etc / passwdファイル//表示ライン5と6行
ルート-n | awkの!NR = 1 {印刷} '//最初の行を表示しません。
 
//マッチングブロック
!// //純粋な純粋な文字が文字に一致する一致しない    !A2 / A1またはA2のフィールド値が一致| ~~ //フィールドの値が一致するフィールドの値が一致していない〜/ A1を   
awkの/ mysqlの/ '/ etc / passwdファイル
AWK '/ MySQLの/ {印刷}' / etc / passwdファイル
3つの命令としてのawk '/ mysqlの/ {$ 0印刷}' / etc / passwdファイル//結果
awkの!/ mysqlの/ {$ 0印刷} 'etc / passwdファイル//は/出力ラインのmysqlと一致しません
awkの/ mysqlの|メール/ {印刷} '/ etc / passwdファイル
awkの/ mysqlの|!メール/ {印刷} '/ etc / passwdファイル
AWK -F: '/メール/、/ MySQLの/ {印刷}' / etc / passwdファイル//整合部
AWK '/ [2] [7] [7] * / {$ 0印刷}' / etc / passwdファイル// 27は、27,277,2777などの行の先頭に一致する番号を含みます...
awkの-F: '$ 1〜/メール/ {$ 1印刷}' / etc / passwdファイル// $図1からは、指定された表示内容と一致しました
awkの-F: '{もし($ 1〜/メール/)$ 1印刷}' 上記のように/ etc / passwdファイル//同じ
awkの-F:/ etc / passwdファイル//が一致しない '$ 1〜/メール/ {$ 1}印刷します!'
awkの-F: '!$ 1~ /メール| mysqlの/ {$ 1印刷}' / etc / passwdファイル        
 
IF文
あなたは{}であること、および括弧()内で内容を比較しなければなりません
awkの-F: '{もし($ 1〜/メール/)$ 1印刷}' / etc / passwdファイル//速記
awkの-F: '{もし($ 1〜/メール/){} $ 1 [プリント画像}' / etc / passwdファイル//全写
awkの-F: '{もし($ 1〜/メール/){{} $ 2印刷}他に$ 1印刷}' / etc / passwdファイル// ...他にあれば...
 
 
条件式
==!=>> =  
awkの-F ":" '$ 1 == "mysqlの" {$ 3印刷}' / etc / passwdファイル  
AWK -F ":" 上記のように '{($ 1 == "のMySQL")場合には、$ 3印刷}' / etc / passwdファイル//同じ 
awkの-F ":" '!$ 1 = "mysqlの" {$ 3印刷}' / etc / passwdファイル//等しくありません
awkの-F ":" より/ etc / passwdファイル//大きい '$ 3>の1000年{$ 3印刷}'
AWK -F ":" '$ 3>を= 100 {$ 3印刷}' / etc / passwdファイル//以上
awkの-Fは、 ":" '$ 3' 1 {$ 3印刷}'/ etc / passwdファイル//未満
awkの-F ":" '$ 3' = 1 {$ 3印刷}'/ etc / passwdファイル//以下
 
論理演算子
&& || 
awkの-F: '$ 1〜/メール/ && $ 3>の8 {印刷}' / etc / passwdファイル//ロジック、$マッチングメール、および$ 3>の8
awkの-F: '{もし($ 1〜/メール/ && $ 3>の8)印刷}' / etc / passwdファイル
awkの-F: '$ 1〜/メール/ || $ 3>の1000年{印刷}' / etc / passwdファイル//論理和(OR)
awkの-F: '{もし($ 1〜/メール/ || $ 3>の1000)印刷}' / etc / passwdファイル 
 
数値計算
awkの-F: '$ 3>の100' / etc / passwdファイル    
awkの-F:「$ 3>の100 || $ 3 '、5' / etc / passwdファイル  
awkの-F: '$ 3 + $ 4> 200' / etc / passwdファイル
awkの-F: '/ mysqlの|メール/ {$ 3 + 10を印刷}' / etc / passwdファイル//は、3番目のフィールドを印刷プラス10 
awkの-F:/ etc / passwdファイル//減算 '/ mysqlの/ {$ 3 - $ 4印刷}'
awkの-F: '/ mysqlの/ {* $ 4 $ 3印刷}' / etc / passwdファイル//製品を見つけます
awkの/ MEMFREE / {$ 1024分の2を印刷} 'は/ proc / meminfoに//除法
awkの/ MEMFREE / {印刷INT($ 2/1024)} 'は/ proc / meminfoに//取整
 
出力区切りOFS
awkの「$ 6~ / FIN / || NR == 1 {印刷NR、$ 4 $ 5、$ 6}」OFS = "\ T" netstat.txt
awkの「$ 6~ / WAIT / || NR == 1 {印刷NR、$ 4 $ 5、$ 6}」OFS = "\ T" netstat.txt        
//出力整合WAITフィールド線6において、前記出力回線番号、フィールド4,5,6、および使用して、タブで区切られたフィールドの各
 
ファイルへの出力処理結果
①コマンドコードブロックがそのまま出力されるルートで-n | '!NR = 1 {印刷> "./fs"}' のawk   
②出力リダイレクトルート-n | '!NR = 1 {印刷}' のawk> ./fs
 
書式付き出力
netstatの-anp | awkの '{printf関数 "%-8s%-8s%-10s \ n" は、$ 1、$ 2、$ 3}' 
printfの出力形式表現
%フォーマットされた出力デリミタ
長さは8文字-8
sが文字列型を表し、
最初の3つのフィールドの各ラインを印刷し、最初のフィールドは、出力文字列(長さ8)、第二の出力文字列フィールドタイプ(長さ8)のタイプを指定し、
出力列型(長さ10)の第3フィールド
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:「{($ 3>の100)印刷 "大" の場合。他の印刷 "小さな"}」/ etc / passwdファイル
小さい
小さい
小さい
小さい
小さい
AWK -F:「{A = 0、B = 0} BEGIN {IF($ 3>の100){A ++。プリント++他{B} "大"; プリント "小"}} END {印刷A、 "\ T"、B}」/ etc / passwdファイル 
                                                                                                                  // IDは、Aプラス1 100よりも大きい、またはBプラス1
awkの-F: '{($ 3' 100)次の場合は、他の印刷}'/ etc / passwdファイル//は100未満、または表示をスキップ
AWK -F: '{i = 1} {(iはNFを<)印刷NR、NF場合には、私は++} BEGIN' / etc / passwdファイル   
AWK -F: 'BEGIN {i = 1} {(iはNFを<)場合、{印刷NR、NF} iは++}' / etc / passwdファイル
別の形態
awkの-F: '{印刷(?$ 3>の100 "はい": "いいえ")}' / etc / passwdファイル 
awkの-F: '{印刷($ 3>の100 $ 3→ ":tyes \":$ 3 ":\ TNO")}' / etc / passwdファイル
 
while文
AWK -F:/ etc / passwdファイル 'BEGIN {I 1 = {}プリントNF(iはNFを<)しながら、$ iはiが++します} 
7ルート1
7×2
7 0 3
7 0 4
7ルート5
7 /ルート6
 
配列
netstatコマンドの-anp | awkの!NR = 1 {[$ 6] ++} END {のために(I)で印刷I、 "\ tの"、[I]} '
netstatコマンドの-anp!| awkのNR = 1 {[$ 6] ++} END {(I)でのprintf "%-20s%-10s%-5S \ n" は、私は、 "\ tの"、[用私]}'
9523 1     
9929 1     
6をLISTEN     
7903 1     
3038 / cupsdの1     
7913 1     
10837 1     
9833 1     
 
アプリケーション1
awkの-F: '{印刷NF}' 行あたりhelloworld.sh //出力ファイル番号フィールド
AWK -F: '{$ 1、$ 2、$ 3、$ 4、$ 5印刷}' 5前helloworld.sh //出力フィールド
AWK -F: '{$ 1、$ 2、$ 3、$ 4、$ 5印刷}' OFS = '\ t' のhelloworld.shフロント//出力タブと出力によって分離され5つのフィールド
awkの-F: '{印刷NR、$ 1、$ 2、$ 3、$ 4、$ 5}' OFS = '\ t' のhelloworld.sh //タブ区切りのフィールド、印刷および行番号の前に出力5
 
アプリケーション2
AWK -F#、各出力ライン番号フィールド: '[#]' '' helloworld.sh //複数の区切り文字を指定{NFを印刷}
AWK -F '[#]' '' OFS = '\ t' のhelloworld.sh //タブ区切りフィールド{$ 1、$ 2、$ 3、$ 4、$ 5、$ 6 $ 7印刷}出力マルチプレクサ
 
アプリケーション3
AWK -F「[#/]」 '{印刷NF} helloworld.sh //三枚のセパレータを指定し、行あたりのフィールド数を出力します。
AWK -F '[#/]' '' helloworld.sh //タブ区切り出力マルチフィールド{$ 1、$ 2、$ 3、$ 4、$ 5、$ 6 $ 7 $ 8 $ 9 $ 10 $ 11 $ 12印刷}
 
アプリケーション4
計算/ homeディレクトリ、通常のファイルのサイズ、単位としてKB
ls -lで| awkの!BEGIN {合計= 0} / ^ D / {合計+ = $ 5} END {印刷 "合計サイズがある:"、サム/ 1024、 "KB"} '
LS -l | awkの!BEGIN {合計= 0} / ^ D / {合計+ = $ 5} END {印刷 "合計サイズがある:"、INT(合計/ 1024)、 "KB"} '// intが丸めされます意味
 
アプリケーション5
LISTENと接続するための接続統計情報は、netstat -anp状態の数はどのくらいです
netstatコマンドの-anp | awkの「$ 6~ / LISTEN |(I合計で)のprintf "%-10s%-6s%-3S \ n" はためCONNECTED / {合計[$ 6] ++} END {、私、」」、合計[私]}'
 
アプリケーション6
異なるユーザの統計/ homeディレクトリの下に通常のファイルの合計数はどのくらいですか?
ls -lで!|!awkのNR = 1 && / ^ D / {合計[$ 3] ++} END {のために(I合計で)のprintf "%-6s%-5S%-3S \ n" は、私は、」 」和[I]}」   
mysqlの199 
ルート374 
異なるユーザの通常の統計/ homeディレクトリの下のファイルサイズの合計サイズはどのくらいですか?
LS -l |!awkのNR = 1 && / ^ D / {合計[$ 3] + = $ 5} END {のために(I合計で)のprintf "%-6s%-5S%-3S%-2S \ n" は、I、」」、和[I] / 1024/1024、 "MB"}
 
アプリケーション7
出力結果テーブル
awkは「{数学= 0をBEGIN; ENG = 0; COM = 0;のprintf "LINENO名前号数学、英語、コンピュータ合計\ n" は;のprintf「----------------- -------------------------------------------する\ n "} {数学+ = $ 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" は、" トータル: "数学、ENG、COM;のprintf" % - 24S%-7s%-9s%-20s \ n」は、 "平均:"、数学/ NR、ENG / NR、COM / NR}」TEST0

[ルート@ localhostのホーム]#猫のTEST0 
結婚2143年78 84 77
ジャック2321年66 78 45
トム・2122 48 77 71
マイク・2537 87 97 95
ボブ・2415 40 57 62

おすすめ

転載: www.cnblogs.com/QaStudy/p/11514853.html