1、NF:number of fileds(字段/域的个数)整数
$NF:取最后一列的字符串,等同于$1、$2,… $(NF-1), $NF等等
来看个例子吧
kdvmt@kdvmt:temp$ ls *.sh -al
-rwxr-xr-x 1 kdvmt kdvmt 72 2021-07-12 16:27 fileexist.sh
kdvmt@kdvmt:temp$ ls *.sh -al | awk -F ' ' '{print NF}'
8
kdvmt@kdvmt:temp$ ls *.sh -al | awk -F ' ' '{print $NF}'
fileexist.sh
kdvmt@kdvmt:temp$ ls *.sh -al | awk '{print NF}'
8
kdvmt@kdvmt:temp$ ls *.sh -al | awk '{print $NF}'
fileexist.sh
第一句是想列出后缀是sh的文件的详情,正好只有一个文件是fileexist.sh
第二句是想筛选出总共有几列,是8列,awk -F 指定分隔符(filed separators,fs),这里是空格(默认是空格/Tab)
第三句是想打印最后一列$NF的内容,其实就是文件名
当然也可以把最后一个的NF换成具体的值,这样就是想打印具体的第几列了
kdvmt@kdvmt:temp$ ls *.sh -al | awk -F ' ' '{print $3}'
kdvmt
kdvmt@kdvmt:temp$ ls *.sh -al | awk -F ' ' '{print $6}'
2021-07-12
kdvmt@kdvmt:temp$ ls -al *.sh | awk '{print $1,$2}'
-rwxr-xr-x 1
kdvmt@kdvmt:temp$ ls -al *.sh | awk '{print $1 $2}'
-rwxr-xr-x1
2、FS:输入字符列分隔符 filed seperator (FS变量的值)默认空格
当FS为空的时候,awk会把一行中的每个字符,当成一列来处理
OFS:输出列分隔符
kdvmt@kdvmt:temp$ cat /etc/passwd | awk 'BEGIN{FS=":"} {print $1,$NF}' | head -n 5
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
sync /bin/sync
上面指定输入分隔符是":"
下面指定输出分隔符是"***"
kdvmt@kdvmt:temp$ cat /etc/passwd | awk 'BEGIN{FS=":";OFS="***"} {print $1,$NF}' | head -n 5
root***/bin/bash
daemon***/bin/sh
bin***/bin/sh
sys***/bin/sh
sync***/bin/sync
awk是行处理的,也就是说每次处理一行
$0:每一行,就是这一行
kdvmt@kdvmt:temp$ cat 1.txt
hello world
good idea
black cat
kdvmt@kdvmt:temp$ cat 1.txt | awk '{OFS=":"} {print $1,$2}'
hello:world
good:idea
black:cat
kdvmt@kdvmt:temp$ cat 1.txt | awk '{OFS=":"} {print NF,$1}'
2:hello
2:good
2:black
kdvmt@kdvmt:temp$ cat 1.txt | awk '{OFS=":"} {print $0,$NF}'
hello world:world
good idea:idea
black cat:cat
3、RS:Record Separator,记录行分隔符,每行记录都是以“\n”为一个(换行的)标志
ORS:OutPut Record Separator 输出当前记录分隔符
kdvmt@kdvmt:temp$ awk 'BEGIN {OFS=":";ORS="#\n"} {print $1,$0}' 1.txt
hello:hello world#
good:good idea#
black:black cat#
kdvmt@kdvmt:temp$ cat 2.txt
hello*world*morning
kdvmt@kdvmt:temp$ cat 2.txt | awk 'BEGIN {RS="*"} {print $0}'
hello
world
morning
4、NR:number of record 记录的数目,表示当前读取的行数
从1开始,新的文件延续上面的计数,新文件不从1开始
FNR:读取文件的记录数(行号),从1开始,新的文件重新从1开始计数
kdvmt@kdvmt:temp$ cat 3.txt | awk '{print "line num: " NR}'
line num: 1
line num: 2
line num: 3
解析:当读取第一个文件的A的时候NR 和 FNR 都是从1开始计数,这时NR==FNR 将行全部内容赋值给数组,当读取到第二个文件时,NR!=FNR此时表示已读取到第二个文件
kdvmt@kdvmt:temp$ cat 1.txt
hello world
good idea
black cat
kdvmt@kdvmt:temp$ cat 3.txt
hello world
good morning
up down
kdvmt@kdvmt:temp$ awk '{print "NR = " NR, "FNR = " FNR}' 1.txt 3.txt
NR = 1 FNR = 1
NR = 2 FNR = 2
NR = 3 FNR = 3
NR = 4 FNR = 1
NR = 5 FNR = 2
NR = 6 FNR = 3