LINUX-AWK-2-重要预置变量


 1. FS(Field Separator):设置输入字段分割符, 默认为空白字符

 2. OFS(Out of Field Separator):设置输出字段分隔符, 默认为空白字符

 3. RS(Record Separator):设置输入记录分割符(即行分割符),默认是换行符(\n)

 4. ORS(Output Record Separate):设置输出记录分割符, 默认是换行符

 5. NF(Number of Field):当前行的字段的个数,即当前行被分割成了几列

 6. NR(Number of Record):当前正在处理的行号,同时输入多个文件时,跨文件时此变量不会重置,也是表示AWK已经遍历的行数

 7. FNR:单文件计数的行号,只输入一个文件时NR与FNR相等

 8. FILENAME: 当前输入文件的名字

1. 使用FS 和 OFS分割行再拼接输出

[root@rabbit-api-001 test]# ll
total 48
-rw-r--r-- 1 root root    32 Apr 27 08:12 a.txt
-rw-r--r-- 1 root root    48 Apr 27 08:15 b.txt
-rw-r--r-- 1 root root   208 Apr 26 14:59 casedemo.sh
-rw-r--r-- 1 root root   288 Apr 26 15:36 func.sh
-rw-r--r-- 1 root root   108 Apr 26 14:48 loop.sh
-rw-r--r-- 1 root root   100 Apr 26 15:19 recase.sh
-rw-r--r-- 1 root root 14531 Apr 27 12:20 resource.txt
-rw-r--r-- 1 root root   119 Apr 27 13:37 test.txt
-rw-r--r-- 1 root root   218 Apr 26 16:06 user.txt
[root@rabbit-api-001 test]# ll|awk 'BEGIN{FS="Apr";OFS="***"} {print $1,$2}'
total 48***
-rw-r--r-- 1 root root    32 *** 27 08:12 a.txt
-rw-r--r-- 1 root root    48 *** 27 08:15 b.txt
-rw-r--r-- 1 root root   208 *** 26 14:59 casedemo.sh
-rw-r--r-- 1 root root   288 *** 26 15:36 func.sh
-rw-r--r-- 1 root root   108 *** 26 14:48 loop.sh
-rw-r--r-- 1 root root   100 *** 26 15:19 recase.sh
-rw-r--r-- 1 root root 14531 *** 27 12:20 resource.txt
-rw-r--r-- 1 root root   119 *** 27 13:37 test.txt
-rw-r--r-- 1 root root   218 *** 26 16:06 user.txt

2. 设置输入行分割符RS和输出行分割符ORS

[root@rabbit-api-001 test]# ll
total 52
-rw-r--r-- 1 root root    32 Apr 27 08:12 a.txt
-rw-r--r-- 1 root root    48 Apr 27 08:15 b.txt
-rw-r--r-- 1 root root   208 Apr 26 14:59 casedemo.sh
-rw-r--r-- 1 root root   288 Apr 26 15:36 func.sh
-rw-r--r-- 1 root root   519 Apr 27 15:00 line.txt
-rw-r--r-- 1 root root   108 Apr 26 14:48 loop.sh
-rw-r--r-- 1 root root   100 Apr 26 15:19 recase.sh
-rw-r--r-- 1 root root 14531 Apr 27 12:20 resource.txt
-rw-r--r-- 1 root root   119 Apr 27 13:37 test.txt
-rw-r--r-- 1 root root   218 Apr 26 16:06 user.txt
[root@rabbit-api-001 test]# ll|awk 'BEGIN{RS="root root"} {print $0}'  # 此命令把原来“root root”作为行分割符,再以默认的行分割符即\n输出,便得到下面的结果
total 52
-rw-r--r-- 1 
    32 Apr 27 08:12 a.txt
-rw-r--r-- 1 
    48 Apr 27 08:15 b.txt
-rw-r--r-- 1 
   208 Apr 26 14:59 casedemo.sh
-rw-r--r-- 1 
   288 Apr 26 15:36 func.sh
-rw-r--r-- 1 
   519 Apr 27 15:00 line.txt
-rw-r--r-- 1 
   108 Apr 26 14:48 loop.sh
-rw-r--r-- 1 
   100 Apr 26 15:19 recase.sh
-rw-r--r-- 1 
 14531 Apr 27 12:20 resource.txt
-rw-r--r-- 1 
   119 Apr 27 13:37 test.txt
-rw-r--r-- 1 
   218 Apr 26 16:06 user.txt
                            # 这里多了一行空行,没搞明白为什么,按道理,是在文本行中间分割的,最后应该不会有空行的。
[root@rabbit-api-001 test]# ll|awk 'BEGIN{RS="root root"; ORS="mysql mysql"} {print $0}'  #再设置输出行分割符即可把原来"root root"替换为"mysql mysql",因为上面的结果多个空行所以最后多了一行“mysql mysql”
total 56
-rw-r--r-- 1 mysql mysql    32 Apr 27 08:12 a.txt
-rw-r--r-- 1 mysql mysql    48 Apr 27 08:15 b.txt
-rw-r--r-- 1 mysql mysql   208 Apr 26 14:59 casedemo.sh
-rw-r--r-- 1 mysql mysql   288 Apr 26 15:36 func.sh
-rw-r--r-- 1 mysql mysql   519 Apr 27 15:00 line.txt
-rw-r--r-- 1 mysql mysql   108 Apr 26 14:48 loop.sh
-rw-r--r-- 1 mysql mysql   606 Apr 27 15:18 newline.txt
-rw-r--r-- 1 mysql mysql   100 Apr 26 15:19 recase.sh
-rw-r--r-- 1 mysql mysql 14531 Apr 27 12:20 resource.txt
-rw-r--r-- 1 mysql mysql   119 Apr 27 13:37 test.txt
-rw-r--r-- 1 mysql mysql   218 Apr 26 16:06 user.txt
mysql mysql
[root@rabbit-api-001 test]# ll
total 536
-rw-r--r--  1 root root     52 Apr 28 07:58 a.txt
-rw-r--r--  1 root root    347 Apr 30 13:27 b.txt
drwxr-xr-x 10 root root    328 Apr 29 10:28 djmockserver
-rw-r--r--  1 root root 529365 Apr 28 21:25 djmockserver.zip
-rw-r--r--  1 root root    241 Apr 28 07:57 select.sh
-rw-r--r--  1 root root     42 Apr 28 20:34 test.txt
[root@rabbit-api-001 test]# ll|awk 'BEGIN{RS="root root";ORS="mysql mysql"}{print $0}'|awk 'NR>1{print line}{line=$0}'  # 再加个处理,把最后一行多余的去掉
total 536
-rw-r--r--  1 mysql mysql     52 Apr 28 07:58 a.txt
-rw-r--r--  1 mysql mysql    347 Apr 30 13:27 b.txt
drwxr-xr-x 10 mysql mysql    328 Apr 29 10:28 djmockserver
-rw-r--r--  1 mysql mysql 529365 Apr 28 21:25 djmockserver.zip
-rw-r--r--  1 mysql mysql    241 Apr 28 07:57 select.sh
-rw-r--r--  1 mysql mysql     42 Apr 28 20:34 test.txt
# 利用awk按行遍历,依次执行body的特点, 
# awk 'NR>1{print line}{line=$0}'   # 作用是去掉最后一行。
# 首轮先输出line(此时为空值,打印空行,所以用NR>1跳过此输出),再把首行赋值给line变量,
# 然后在第二轮输出了line(此时为第一行内容),循环到最后一行时,输出为倒数第二行内容。
# 最后把最后一行赋值给line,但循环已完,所以最后一行不会输出,即去掉最后一行。

3. NF获取当前列数,即一行被分割的份数

[root@rabbit-api-001 test]# ll
total 536
-rw-r--r--  1 root root     52 Apr 28 07:58 a.txt
-rw-r--r--  1 root root    347 Apr 30 13:27 b.txt
drwxr-xr-x 10 root root    328 Apr 29 10:28 djmockserver
-rw-r--r--  1 root root 529365 Apr 28 21:25 djmockserver.zip
-rw-r--r--  1 root root    241 Apr 28 07:57 select.sh
-rw-r--r--  1 root root     42 Apr 28 20:34 test.txt
[root@rabbit-api-001 test]# ll| awk '{print "line"NR, NF}'
line1 2
line2 9
line3 9
line4 9
line5 9
line6 9
line7 9

4. 全部文件已处理过的行数NR和当前文件 中已处理过的行数FNR

[root@rabbit-api-001 test]# cat -n a.txt 
     1	a1
     2	a2
     3	a3
     4	a4
[root@rabbit-api-001 test]# cat -n b.txt 
     1	b1
     2	b2
     3	b3
     4	b4
[root@rabbit-api-001 test]# awk '{print "NR:"NR,"FNR:"FNR,$0}' a.txt b.txt 
NR:1 FNR:1 a1
NR:2 FNR:2 a2
NR:3 FNR:3 a3
NR:4 FNR:4 a4
NR:5 FNR:1 b1
NR:6 FNR:2 b2
NR:7 FNR:3 b3
NR:8 FNR:4 b4
# 从上面的结果可以看到,如果只有一个文件时,NR与FNR相同。
# 如果多个文件,NR在跨文件时,不会重置,而FNR会重置,此时NR和FNR只能在第一个文件时是相同的

5.当前行所属文件的文件名

[root@rabbit-api-001 test]# awk '{print "FINAME:"FILENAME,$0}' a.txt b.txt 
FINAME:a.txt a1
FINAME:a.txt a2
FINAME:a.txt a3
FINAME:a.txt a4
FINAME:b.txt b1
FINAME:b.txt b2
FINAME:b.txt b3
FINAME:b.txt b4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值