linux-awk

 linux-shell  awk


# 语法结构
awk 'BEGIN{ print "start" } pattern { commands } END{ print "end" }' file

# $NF当前行的最后一个字段
# $(NF-1)当前行的倒数第二个字段
# NF当前行的字段数
awk 'BEGIN {print "start";} { print  NR"\t"NF"\t"$(NF-4)"\t"$1"\t"$8 } END{ print "end" }' test.txt

# 传递外部变量
echo | awk '{print v1, v2}' v1="hello" v2=""world
awk -F' ' '{print v1, v2}' v1="hello" v2="world" test.txt
var1="hello"; var2="world";
echo | awk '{print v1, v2}' v1=$var1 v2=$var2

# 使用getline读取一行
awk 'BEGIN{ getline; print $0 }' test.txt

# 行号小于5的行
awk 'NR < 5 {print $0}' test.txt
# 打印第1到4行
awk 'NR==1,NR==4 {print $0}' test.txt
# 打印第2到3行
awk 'NR==2,NR==3' test.txt

# 包含样式.sh的行
awk 'BEGIN{} /.sh/ {print $0} END{}' test.txt

# 不包含样式.sh的行
awk 'BEGIN{} !/.sh/ {print $0} END{}' test.txt

# 打印第二行
seq 9 |xargs -n 3|awk 'NR==2 {print $0}'

# 打印第二列
seq 9 |xargs -n 3|awk '{print $2}'

# 打印第二行的列数
seq 9 |xargs -n 3|awk 'NR==2 {print NF}'

# 求和
seq 9 | awk 'BEGIN{sum=0;} {print $1"+"; sum+=$1} END{print "="sum}'

# 当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符
echo | awk '{var1="v1"; var2="v2";print var1,var2}'

# 在awk的print语句中,双引号是被当作拼接操作符使用的
echo | awk '{var1="v1"; var2="v2";print var1"-"var2}'

# 指定分隔符
awk -F: 'NR==2,NR==3 {print $1}' /etc/passwd

echo|awk '{print length("abcde")}'
echo|awk '{print index("abcde", "d")}'
echo|awk '{print substr("abcde", 1, 3)}'
echo|awk 'BEGIN{print match("12", /[0-9]+/);}'

# 输出文件的第十行
cat file.txt | awk 'NR==10 { print $0}'

# 统计文件中单词出现的频次
cat words.txt | grep -E -o "\b[[:alpha:]]+\b" | awk '{count[$0]++} END{ for(ind in count) { printf("%s %s\n", ind, count[ind])} }'|sort -k2 -r -n

cat file.txt | awk '{for(i=1;i<=NF;i++){a[i]=a[i]_FS$i};_FS=FS}END{for(i=1;i<=NF;i++){print a[i]}}'