awkツール
Awkはラインプロセッサです。画面処理の利点と比較して、大きなファイルを処理するときにメモリオーバーフローや処理速度の低下は発生しません。通常、テキスト情報のフォーマットに使用されます
。Awk処理プロセス:各行が順番に処理され、出力されます。1. Awk
ワークフローの
例:
awk -F ':' '{print $1,$3,$4}' /etc/passwd
1)awkコマンドはファイルの内容を
1行ずつ読み取り、処理します。2)Awkはデータの最初の行を7セグメントにフォーマットするために区切り文字として「:」を使用し、データの各セグメントを$ 1に保存します– $ 7変数。$ 0はこの1行のデータを格納します
3)1行の処理が完了し、ファイルの読み取りが終了するまで次の行の処理を続行します
2. awkの一般的な使用法
awk 选项 '模式或条件 { 编辑指令 }' 文件1 文件2 …
awk -f 脚本文件 文件1 文件2 …
特別な組み込み変数
コマンド | 効果 |
---|---|
$0 |
現在の行全体を表します |
$1 |
各行の最初のフィールド |
NF |
フィールド変数の数 |
NR |
複数のファイルによって増分された、各行のレコード番号 |
FNR |
NRに似ていますが、複数ファイルのレコードは増分されず、各ファイルは1から始まります |
FILENAME |
ファイル名 |
\t |
タブ |
\n |
改行 |
FS |
BENGIN時にセパレーターを定義する |
RS |
入力レコードセパレータ。デフォルトは改行です。 |
~ |
==との正確な比較ではなく一致 |
!~ |
不一致、不正確な比較 |
== |
等しい、すべて等しくなければならない、正確に比較する |
&& |
論理的および |
|| |
論理OR |
+ |
一致する場合、1以上を意味します |
/[0-9][0-9]+/ |
2つ以上の数字 |
[0-9][0-9]* |
1つ以上の数字 |
OFS |
出力フィールドセパレータ。デフォルトもスペースで、タブなどに変更できます。 |
ORS |
出力レコードセパレータ。デフォルトは改行文字です。つまり、処理結果も行ごとに画面に出力されます。 |
-F'[]' |
複数のセパレータを定義する |
awkの使用例
创建测试文件
[root@localhost ~]# vim test.txt
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the li
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
1)行ごとにテキストを出力し、cat test.txtに相当するすべてのコンテンツを出力
します
[root@localhost ~]# awk '{print}' test.txt
或
[root@localhost ~]# awk '{print $0}' test.txt
1〜3行目
[root@localhost ~]# awk 'NR==1,NR==3{print}' test.txt
或
[root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' test.txt
出力奇数ライン%2モジュロ演算、残りは1は奇数、0は偶数
[root@localhost ~]# awk '(NR%2)==1{print}' test.txt
偶数行を出力
[root@localhost ~]# awk '(NR%2)==0{print}' test.txt
ルートで始まる出力行
[root@localhost ~]# awk '/^root/{print}' /etc/passwd
bashで終わる出力行
[root@localhost ~]# awk '/bash$/{print}' /etc/passwd
/ bin / bashで終わる行を数える
[root@localhost ~]# awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END {print x}' /etc/passwd
或
[root@localhost ~]# grep -c '/bin/bash$' /etc/passwd
空白行で割ったテキスト段落の数を数える
[root@localhost ~]# awk 'BEGIN{RS=""};END{print NR}' /etc/sysctl.conf
2)フィールドごとにテキストを出力各行のスペースまたはタブストップで区切られた3番目のフィールドを出力
します
[root@localhost ~]# awk '{print $3}' test.txt
フィールド1、3
[root@localhost ~]# awk '{print $1,$3}' test.txt
パスワードが空白の行
[root@localhost ~]# awk -F ":" '$2==""{print}' /etc/shadow
出力は「:」で分割されます。7番目のフィールドに/ bashが含まれている行の最初のフィールドです。
[root@localhost ~]# awk -F: '$7~"/bash"{print $1}' /etc/passwd
出力の最初のフィールドにはnfsが含まれ、8つのフィールドを含む行の最初と2番目のフィールドには
[root@localhost ~]# awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services
7番目のフィールドが/ bin / bshまたは/ sbin / nologinでない行を出力します
[root@localhost ~]# awk -F: '($7!="/bin/bsh")&&($7!="/sbin/nologin"){print}' /etc/passwd
3)パイプと二重引用符でシェルコマンドを
呼び出し、wc -lコマンドを呼び出して、bashを使用しているユーザーの数をカウントします
[root@localhost ~]# awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
或
[root@localhost ~]# grep -c "bash$" /etc/passwd
wコマンドを呼び出して、オンラインユーザーの数をカウントします。
[root@localhost ~]# awk 'BEGIN {while ("w"|getline)n++;{print n-2}}'
ホスト名を呼び出し、現在のホスト名を出力します
[root@localhost ~]# awk 'BEGIN {"hostname"|getline;print $0}'