2016-02-04

awk Tips

awkについてφ(・ω・ )メモメモ

標準入力をそのまま標準出力に出力する。
$ cat foo.txt | awk '{print $0}'
標準入力をそのまま標準出力に出力する。
$ cat foo.txt | awk '1'
空行を削除する。
$ awk '/./' foo.txt
空行を削除する。
$ awk 'NF' foo.txt
最初の 10 行を表示する。
$ awk 'NF >= 10' foo.txt
一行ごとに改行を追加する。
$ awk '1;{print ""}' foo.txt
一行ごとに改行を追加する。
awk 'BEGIN{ORS="\n\n"};1' foo.txt
ファイルに行番号を付ける。
$ awk '$0 = NR OFS $0' foo.txt
ファイルに行番号を付ける。
$ awk '{print NR "\t" $0}' foo.txt
ファイル毎に行番号を付ける。
$ awk '{prin FNR "\t" $0}' foo*.txt
行番号を 4 桁で表示させる。
$ awk '{printf("%4d : %s\n", NR, $0)}' foo.txt
最も長い行の長さを表示する。
$ awk '{if (length($0) > max) max = length($0)} END {print max}' foo.txt
80 文字を越える行を表示する。
$ awk 'length($0) > 80' foo.txt
0 から 100 までの間の乱数を 5 つ表示する。
$ awk 'BEGIN {for (i = 1; i <= 7; i++) print int(101 * rand())}'
ファイルの行数を数える。
$ awk 'END {print NR}' foo.txt
奇数行を表示する。
$ awk 'NR % 2 == 1' foo.txt
偶数行を表示する。
$ awk 'NR % 2 == 0' foo.txt
最初の 1 行を表示する。
$ awk 'NR == 1' foo.txt
最初の 1 行を表示する。
$ awk '{print; exit}' foo.txt
最後の 1 行を表示する。
$ awk 'END {print}' foo.txt
最後の 1 行を表示する。
$ awk '{last = $0} END {print last}' foo.txt
同一行の削除を行う。(uniq)
$ awk 'a !~ $0; {a = $0}' foo.txt
同一行の削除を行う。(uniq)
$ awk '{if ($0 != line || NR == 1) print; line = $0}' foo.txt
行のソートを行う。(gawk 以上)
$ gawk '{line[NR] = $0} END {asort(line); for (i = 1; i <= length(line); i++) print line[i]}' foo.txt
10 行目から 20 行目までを表示する。
$ awk 'NR == 10, NR == 20 {print $0}' foo.txt
1 から 10 までの数字を生成する。
$ awk 'BEGIN {for (i == 1; i <= 10; i++) print i}'
'#' で始まるコメントを削除する。
$ awk '{sub(/#.*/, "", $0)}1' foo.txt
さいころを作る。
$ awk 'BEGIN {srand();print int(rand() * 6 + 1)}'
ワード数をカウントする。
$ awk '{n += NF} END {print n}' foo.txt
文字数をカウントする。
$ awk '{n += length($0)} END {print n}' foo.txt
Load Average を表示する。(Linux のみ)
$ awk '{print $1}' /proc/loadavg
yes コマンドを作る。(延々と 'y' を返す)
$ awk 'BEGIN {for (;;) print "y"}'
yes コマンドを作る。(延々と 'y' を返す)
$ awk 'BEGIN {while (awk != "Perl") print "y"}'
Apache のログにある IP アドレスからホスト名をリアルタイムで引く。(root のみ)
# tail -f /var/log/httpd/access_log | gawk '{system ("dig -x" $1 " +short")}'
Apache のログからリンク元をリアルタイムで表示する。(root のみ)
# tail -f /var/log/httpd/access_log | gawk -F\" '$4!~/gauc/&&$4!="-"{fflush();print $4}'
CSV (カンマ区切り) から TSV (タブ区切り) への変換を行う。
$ awk -v FS=',' -v OFS='\t' '$1=$1' foo.txt
TSV (タブ区切り) から CSV (カンマ区切り) への変換を行う。
$ awk -v OFS=',' -v FS='\t' '$1=$1' foo.txt
各フィールドの和を求める。
$ awk '{for (i = 1; i <= NF; i++) s += $i} $0=s' foo.txt
各行のフィールド数を表示する。
$ awk '{print NF ":" $0}' foo.txt
最後の行のフィールド数を表示する。
$ awk '{s = NF} END {print NF}' foo.txt
フィールドが 5 以上の行を表示する。
$ awk 'NF >= 5' foo.txt
改行 CR/LF を LF に変換する。
$ awk 'sub(/\r$/,"")' foo.txt
改行 LF を CR/LF に変換する。
$ awk 'sub(/$/,"\r")' foo.txt
行頭の空白とタブを削除する。
$ awk '{sub(/^[ \t]+/, "")}1' foo.txt
行末の空白とタブを削除する。
$ awk '{sub(/[ \t]+$/, "")}1' foo.txt
行頭と行末の空白とタブを削除する。
$ awk '{gsub(/^[ \t]+|[ \t]+$/, "")}1' foo.txt
行頭と行末の空白とタブを削除する。(フィールドも再構成される)
$ awk '$1 = $1' foo.txt
最後の行から表示する。(tac)
$ '{a[i++] = $0} END {for (j = i - 1; j >= 0;) print a[j--]}' foo.txt
正規表現 abc の行を表示する。(grep)
$ awk '/abc/' foo.txt
正規表現 abc にマッチしない行を表示する。(grep -v)
$ awk '! /abc/' foo.txt
Pattern にマッチした前の行を表示する。
$ awk '/Pattern/ {print a} {a=$0}' foo.txt
Pattern にマッチした前の行を表示する。
$ awk '{D[NR] = $0} /match/ {print D[NR-1]}' foo.txt
ファイルサイズが 0 byte のものを表示する。
$ ls -al | awk '$5==0 {print $8}'
Subversion の svn status で '?' の付くファイルを全て svn add する。
$ svn status | gawk '/^?/{print $2}' | xargs svn add

0 件のコメント:

コメントを投稿