Shell - NF、FS(OFS)、RS(ORS)、NR(FNR)用法

本文详细介绍了awk命令中用于处理字段的变量和选项,如NF(字段数量)、FS(输入字段分隔符)、OFS(输出字段分隔符)、RS(记录行分隔符)和ORS(输出记录分隔符),并结合具体例子展示了如何利用这些变量进行文件内容的筛选、分隔和组合。此外,还提到了NR和FNR在处理多文件时的作用。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值