一些非常经典的awk小技巧

时间:2022-07-01 16:04:41
代码:

awk 'NF'

过滤空白行

复制内容到剪贴板

代码:

awk '!a[$0]++'

过滤重复行

复制内容到剪贴板

代码:

awk 'NF-=2'

过滤掉最后两列

复制内容到剪贴板

代码:

awk '/匹配/{a=1}!a'

过滤掉从第一个匹配行到文件尾

复制内容到剪贴板

代码:

awk '/匹配/{a=1}a'

或者

复制内容到剪贴板

代码:

awk '/匹配/,0'

打印从第一个匹配行到文件尾

复制内容到剪贴板

代码:

awk '/匹配/{getline v;print $0"\n"v}'

打印匹配行和下一行

复制内容到剪贴板

代码:

awk '/匹配/{print v"\n"$0}{v=$0}'

打印匹配行和上一行

复制内容到剪贴板

代码:

awk '/匹配/{print a"\n"b"\n"$0}{a=b;b=$0}'

打印匹配行和上两行

复制内容到剪贴板

代码:

awk '/匹配/{print x};{x=$0}'

打印匹配的上一行

复制内容到剪贴板

代码:

awk '/匹配/{getline;print}'

打印匹配的下一行

复制内容到剪贴板

代码:

awk '/匹配A/,/匹配B/'

打印从第一个匹配A行至第一个匹配B行

复制内容到剪贴板

代码:

awk '/匹配/&&!a++{next}1'

仅过滤第一次匹配行

复制内容到剪贴板

代码:

awk '{printf NR%2?$0FS:$0RS}'

两行合并成一行打印

复制内容到剪贴板

代码:

awk 'ORS=NR%3?"\n":"\n\n"'

每3行插一行空行

复制内容到剪贴板

代码:

awk 'a=!a'

打印奇数行

复制内容到剪贴板

代码:

awk '!(a=!a)'

打印偶数行

复制内容到剪贴板

代码:

awk 'BEGIN{OFS="\n"}{getline a;print a,$0}'

调换奇偶行打印文本

复制内容到剪贴板

代码:

awk 'END{print NR}'

模拟wc -l

复制内容到剪贴板

代码:

awk 'BEGIN{print "'\''"}'

打印单引号,print后边依次为:双引号单引号转义单引号单引号双引号

复制内容到剪贴板

代码:

awk 'BEGIN{print "\""}'

打印双引号,print后边依次为:双引号转义双引号双引号

复制内容到剪贴板

代码:

awk 'BEGIN{RS="";FS="\n"}{print NF}'

以一个空行为每段文本的分割标准,统计每段文本的行数

复制内容到剪贴板

代码:

awk -vRS="\n\n" -vOFS=" " '$1=$1'

以一个空行为每段文本的分割标准,把一段文字整合成一行

复制内容到剪贴板

代码:

awk  '{a=$2;$2=$4;$4=a}1'

列交换

复制内容到剪贴板

代码:

awk -F . 'substr($2,0,1)>=5?a=$1+1:a=$1{print a}'

计算小数4舍5入

复制内容到剪贴板

代码:

awk '/[^!-~]/'

打印包含中文的行

复制内容到剪贴板

代码:

awk '/[!-~]/'

这个不解释了会上一个就会这个了,重点说一下执行这个名列前最好执行下LANG=C

复制内容到剪贴板

代码:

awk '{y=x "\n" $0; x=$0};END{print y}'

模拟tail -2

复制内容到剪贴板

代码:

awk 'NF{a=$NF}END{print a}'

打印最后一行最后一个单词

复制内容到剪贴板

代码:

awk -va=$(grep -c "" file) '(NR!=a-2&&NR!=a-3)'  file

过滤file中的倒数第3、4行

复制内容到剪贴板

代码:

awk '{print $1 > "file"}' file

只保留file的第一列(危险直接修改文件内容)

复制内容到剪贴板

代码:

awk 'BEGIN{now=strftime("%T");print now}'

模拟date +%T