Awkは、高度なテキスト処理用に設計された非常に強力で便利なツールです。 ファイルを1行ずつ検索およびスキャンし、各入力行をフィールドに分割し、1つまたは複数の入力行をパターンと比較して、一致した行に対してアクションを実行します。 通常、データファイルを変換してフォーマットされたレポートを作成するために使用されます。
このチュートリアルでは、日常の操作を実行するのに役立つ、高度で便利なawkワンライナーの例をいくつか示します。
テキスト変換
このセクションでは、awkコマンドでsubおよびgsub関数を使用して、ファイル内のタブとスペースを削除する方法を学習します。
この記事のすべての例の入力ファイルとして、次のテキストファイルを使用します。
cat > contents.txt
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
ファイルからすべての空白行を削除します
特別なNF変数を指定してawkコマンドを使用すると、ファイルからすべての空白行を削除できます。
にとって example、ファイルcontents.txtからすべての空白行を削除します。次のコマンドを実行します。
awk NF contents.txt
次の出力が表示されます。
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
次のコマンドでも同じことを実行できます。
awk '/./' /contents.txt
各行の先頭から先頭の空白とタブを削除します
awkコマンドを使用して、ファイルの先頭にある1つ以上のスペースまたはタブを検索し、それらを削除できます。
次のコマンドを実行して、contents.txtという名前のファイルから先頭の空白を削除します
awk '{ sub(/^[ t]+/, ""); print }' contents.txt
次の出力が表示されます。
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
各行の終わりから末尾の空白とタブを削除します
ファイルの各行の終わりに1つ以上のスペースまたはタブを見つけて、それらを削除できます。
次のコマンドを実行して、ファイルcontents.txtの各行の最後にあるスペースとタブを削除します。
awk '{ sub(/[ t]+$/, ""); print }' contents.txt
次の出力が得られるはずです。
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
各行から先頭と末尾の両方の空白を削除します
以下に示すように、1つのコマンドを使用して、各行から先頭と末尾の両方の空白を削除することもできます。
awk '{ gsub(/^[ t]+|[ t]+$/, ""); print }' contents.txt
次の出力が得られるはずです。
hitesh engineer sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
行の逆順
これは非常に人気があり、非常に便利なawk one-linerであり、すべての行を配列に記録し、それらを逆の順序で配置します。
このawkone-linerを実行して、ファイルcontents.txtのすべての行を逆の順序で配置します。
awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' contents.txt
次の出力が得られるはずです。
deep clerk sales 20000
jay peon purchase 23000
niraj clerk account 20000
rajesh directory sales 40000
bhavesh engineer sales 30000
vyom manager purchase 20000
jayesh director account 25000
hitesh engineer sales 30000
各行のフィールドの逆順
NF変数を指定してawkコマンドを使用すると、各行の各フィールドを逆の順序で配置できます。
awk '{ for (i=NF; i>0; i--) printf("%s ", $i); printf ("n") }' contents.txt
次の出力が得られるはずです。
30000 sales engineer hitesh
25000 account director jayesh
20000 purchase manager vyom
30000 sales engineer bhavesh
40000 sales directory rajesh
20000 account clerk niraj
23000 purchase peon jay
20000 sales clerk deep
連続する重複行を削除する
ファイルから連続する重複行を削除するには、次のコマンドを実行します。
awk 'a != $0; { a = $0 }' contents.txt
連続していない重複行を削除する
ファイルから連続していない重複行を削除するには、次のコマンドを実行します。
awk '!a[$0]++' contents.txt
ナンバリングと計算
このセクションでは、awkコマンドでFN変数とNR変数を使用する方法を学習します。 レコード数、フィールド数などの処理やレポートに使用されます。
ファイル内のすべての行に番号を付ける
次のコマンドを使用して、特定のファイルのすべての行に番号を付けることができます。
awk '{ print NR "t" $0 }' contents.txt
次の出力が得られるはずです。
1 hitesh engineer sales 30000
2 jayesh director account 25000
3 vyom manager purchase 20000
4
5 bhavesh engineer sales 30000
6 rajesh directory sales 40000
7 niraj clerk account 20000
8 jay peon purchase 23000
9 deep clerk sales 20000
派手な方法で数直線
特定のファイルのすべての行に派手な形式で番号を付けるには、次のコマンドを実行します。
awk '{ printf("%5d : %sn", NR, $0) }' contents.txt
次の出力が得られるはずです。
1 : hitesh engineer sales 30000
2 : jayesh director account 25000
3 : vyom manager purchase 20000
4 :
5 : bhavesh engineer sales 30000
6 : rajesh directory sales 40000
7 : niraj clerk account 20000
8 : jay peon purchase 23000
9 : deep clerk sales 20000
ファイル内の空白以外の行のみに番号を付ける
次のコマンドを使用して、空でない行にのみ番号を付けることができます。
awk 'NF { $0=++a " :" $0 }; { print }' contents.txt
次の出力が得られるはずです。
1 : hitesh engineer sales 30000
2 :jayesh director account 25000
3 :vyom manager purchase 20000
4 :bhavesh engineer sales 30000
5 : rajesh directory sales 40000
6 :niraj clerk account 20000
7 :jay peon purchase 23000
8 :deep clerk sales 20000
特定の文字列を含む行数を出力します
次のコマンドを使用して、単語エンジニアが含まれる行の総数を出力できます。
awk '/engineer/{n++}; END {print n+0}' contents.txt
次の出力が得られるはずです。
2
正規表現
このセクションでは、awkコマンドで正規表現を使用してファイル内のテキストまたは文字列をフィルタリングする方法を示します。
指定された文字列に一致する行を印刷します
ファイルcontents.txtの文字列エンジニアに一致するすべての行を印刷するには、次のコマンドを実行します。
awk '/engineer/' contents.txt
次の出力が得られるはずです。
hitesh engineer sales 30000
bhavesh engineer sales 30000
指定された文字列と一致しない行を印刷する
ファイルcontents.txtの文字列「jayesh」と一致しないすべての行を出力するには、次のコマンドを実行します。
awk '!/jayesh/' contents.txt
次の出力が得られるはずです。
hitesh engineer sales 30000
vyom manager purchase 20000
bhavesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
一致する文字列の前に行を印刷します
一致する文字列 ‘rajesh’の前の行を印刷するには、次のコマンドを実行します。
awk '/rajesh/{print x};{x=$0}' contents.txt
次の出力が得られるはずです。
bhavesh engineer sales 30000
一致する文字列の後に行を出力します
一致する文字列 ‘rajesh’の後に行を出力するには、次のコマンドを実行します。
awk '/account/{getline; print}' contents.txt
次の出力が得られるはずです。
vyom manager purchase 20000
jay peon purchase 23000
置換
このセクションでは、awkコマンドを使用してファイルで特定の文字列を検索し、目的の文字列に置き換える方法を示します。
文字列をその他に置き換える
contents.txtで文字列「engineer」を「doctor」に置き換えるには、次のコマンドを実行します。
awk '{gsub(/engineer/, "doctor")};{print}' contents.txt
次の出力が得られるはずです。
hitesh doctor sales 30000
jayesh director account 25000
vyom manager purchase 20000
bhavesh doctor sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
文字列「jayesh」、「hitesh」、または「bhavesh」を見つけて、文字列「mahesh」に置き換え、次のコマンドを実行します。
awk '{gsub(/jayesh|hitesh|bhavesh/,"mahesh");print}' contents.txt
次の出力が得られるはずです。
mahesh engineer sales 30000
mahesh director account 25000
vyom manager purchase 20000
mahesh engineer sales 30000
rajesh directory sales 40000
niraj clerk account 20000
jay peon purchase 23000
deep clerk sales 20000
デバイス名で空きディスク容量を探す
dfでawkコマンドを使用すると、デバイス名と各デバイスで使用されているスペースのみを検索して表示できます。
これを行うには、次のコマンドを実行します。
df -h | awk '{print $1, $4}'
次の出力が得られるはずです。
Filesystem Avail
/dev/sda1 235G
none 4.0K
udev 1.9G
tmpfs 377M
none 5.0M
none 1.5G
none 100M
/dev/sda5 135G
/dev/loop0 0
/dev/loop1 0
/dev/loop2 0
/dev/loop4 0
IPごとに開いている接続の数を見つける
このawkワンライナーは、サーバーが攻撃を受けていると思われる場合に非常に役立ちます。 サーバーへの開いている接続のリストを出力し、量で並べ替えます。
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
サーバーへの開いているすべての接続のリストを金額別に取得する必要があります。
18 103.132.192.30
12 104.18.12.5
11 104.18.5.23
9 104.244.42.3
1 104.244.42.5
1 127.0.0.1
結論
ご覧のとおり、実際の例を使用してawkone-linerコマンドについて学習しました。 これがあなたの日常のタスクの実行に役立つことを願っています。