本文是在网上看到,觉得挺有意思,特地拿下来写个自己的理解,方便初学者理解,虽然没啥用,不过重点在思路。
NF 为最后一个字段的字段数。
下面几个例子的作用都一样 都是得到这样一个输出结果,即去掉后缀 .tar.Z
源字符串:AIX.PI6002.090316.tar.Z
结果字符串:AIX PI6002 090316
单独解释:以“.”为分隔符,把最后1个字段 和倒数第2个字段 赋值为空, 再输出整个字段
echo AIX.PI6002.090316.tar.Z | awk -F "." '{$NF="";$(NF-1)=""}{print $0}'
单独解释:以“.”为分隔符,输出前三个字段
echo "xxx.xxxx.xxxx.tar.bz" | awk -F. '{print $1"."$2"."$3}'
单独解释:以“.”为分隔符,把NF的值减去2,即5-2=3
echo AIX.PI6002.090316.tar.Z | awk -F . 'NF-=2'
单独解释:以“.”为分隔符,把NF赋值为NF-2
echo AIX.PI6002.090316.tar.Z | awk 'NF=NF-2' FS=.
单独解释:以“.”为分隔符,把NF的值减去2,输出的分隔符为" "
echo AIX.PI6002.090316.tar.Z | awk 'NF-=2' FS=. OFS=" "
下面输出结果为:AIX.PI6002.090316
单独解释:以“.”为分隔符,把NF的值减去2,同时把分隔符通过sed替换 空格 " " 为 "."
echo "AIX.PI6002.090316.tar.bz" | awk -F . 'NF-=2' | sed 's/ /./g'
单独解释:以“.”为分隔符,通过for循环输出NF-2之前的字段,利用 printf 的结果输出没有换行符,通过print输出第NF-2个字段,print输出结果有换行符,如此拼出结果。
echo AIX.PI6002.090316.tar.Z | awk -F "." '{for (i=1;i<NF-2;i++) printf $i".";print $(NF-2)}'
单独解释:一整个字段为字符串,然后从第一个字符开始,到第三个字段的最后个字符。(match会返回一个数值)
echo AIX.PI6002.090316.tar.Z | awk '{print substr($0,1,match($0,/\.[^\.]+\.[^\.]+$/)-1)}'