シェル正規表現(3)

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}'

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_46902396/article/details/108628203