AWK BEGIN用法
$ echo -e "line1\nline2" | awk 'BEGIN{ print "start"} { print } END { print "END" }'
start
line1
line2
END
特殊标记
$ echo -e "line1 f2 f3 \n line2 f4 f5\n line3 f6 f7" | awk '{
print "Line no:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3 }'
Line no:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
Line no:2, No of fields:3 $0= line2 f4 f5 $1=line2 $2=f4 $3=f5
Line no:3, No of fields:3 $0= line3 f6 f7 $1=line3 $2=f6 $3=f7
NR:当前行号 NF:当前行字段数量
$ seq 5 | awk 'BEGIN { getline; print "Read ahead first line", $0} {print $0}'
Read ahead first line 1
2
3
4
5
$0 表示当前行内容
设置字段定界符
$ awk 'BEGIN { FS=":" }{print $NF}' /etc/passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
从 awk 中读取命令的输出
$ echo | awk '{ "grep root /etc/passwd" | getline cmdout; print cmdout }'
root:x:0:0:root:/root:/bin/bash
单词计数
#!/bin/bash
if [ $# -ne 1 ];
then
echo "Usage: $0 filename";
exit -1
fi
filename=$1
egrep -o "\b[a-zA-Z]+\b" $filename | \
awk '{ count[$0]++ }
END{ printf("%-14s%s\n", "word", "count");
for(ind in count)
{ printf("%-14s%d\n", ind, count[ind]); }
}'
egrep -o
这一行将文本中每一个单词单独作一行输出,为了下面解析方便。
awk
对每行的一个单词计数,主要是利用关联数组的特性, count[$0]++
。
输出如下:
word count
dfs 1
gds 2