まず、awk プログラムの基本的な構造である pattern { action } を見てみましょう。基本的な操作は、テキストを 1 行ずつスキャンし、パターンに一致する行を見つけて、対応するアクションを実行することです。すべての行が読み取られた後に終了します。
まず最も単純な例を見てみましょう。trace.log ファイルには、名前、年齢、勤続年数が含まれています。
星 25 1
月 32 5
太陽 29 3
川 27 4
湖 30 6
海 35 8
ここで、勤続 5 年以上の従業員 (行全体) を検索したいとします。これは 1 つの文で実行できます。必要な式をパターン部分に直接記述します。行全体を識別するために $0 が使用されます。 。
awk '$3 >= 5 {print $0}' trace.log
1 件
の結果:
月 32 5
湖 30 6
海 35 8
出力に行番号を追加したい場合は、Awk には組み込み変数 NR が用意されていますが、それほど多くはありません。
awk '$3 >= 5 {print NR,$0}' trace.log
1 件
の結果:
2 月 32 5
5 湖 30 6
6 海 35 8
printf を使用して出力をフォーマットしたい場合は、それはあなた自身の責任です。
awk '$3 >= 5 {printf("name: %s,age: %d \n",$1,$2)}' trace.log
1 件
の結果 Jiang Zi:
名前: 月、年齢: 32
名前: 湖、年齢: 30
名前: 海、年齢: 35
通常、awk を使用する場合、必要なセグメント化されたデータを出力するアクションしかありませんが、実はまだパターンにコツがあり、moon という名前のデータだけを見たいだけです。
awk '$1 == "moon"' trace.log # moon 32 5
1 つの
パターンは、! ではなく括弧、&&、または || を使用して組み合わせることができます。
awk '$2 >30 && $3 >= 8' trace.log # sea 35 8
1
ここまで言っても、まだ面白くありません。統計が役に立つかもしれません。まず、次の 2 点を理解する必要があります。END キーワードは、最終行の後の位置を一致させるために使用されます。計算用の独自の変数がありますが、その必要はありません。5 年以上働いている人が何人いるか知りたいですか?
awk '$3 >= 5 {total += 1} END {print "超过5年:",total,"人"}' trace.log
1
行ごとにスキャンすることはループのようなもので、ループ中にパフォーマンス (計算) を開始し、END で最後の行と一致し、その後いくつかのアクションを実行します。
合計する方法がわかったので、従業員の平均年齢を確認したいと思います。NR が行数を記録していることを忘れないでください。
awk '{total += $2} END {print total/NR}' trace.log
1.
一般的な年齢レベルを確認したい場合は、おそらく中央値の方が代表的であるため、最初に並べ替える必要があります。
awk '{print $2," ", $3," " $1}' trace.log | sort
1
次に、中央の位置にあるデータを見つければOKです
awk '{print $2," ", $3," " $1}' trace.log | sort | awk '{line[NR] = $1} END {print line[int(NR/2)]}'
1.
年齢の最大値と最小値も確認したいとします。上記の経験を踏まえ、あまり厳密に考えすぎないようにしてください。
awk '{print $2," ", $3," " $1}' trace.log | sort | awk '{line[NR] = $0} END {print line[1],"\n",line[NR]}'
記載されていないキーワードとして、END と同様の BEGIN もありますが、詳しくは説明しませんので、図にまとめてみましょう。