awk 内置变量
awk 内置变量
FS 设置输入域分隔符,等价于命令行 -F选项
OFS 输出域分隔符
NF 浏览记录的域的个数
NR 已读的记录数
RS 控制记录分隔符
ORS 输出记录分隔符
substr 截取指定的字符串
gsub 替换指定字符串
实例:
1. FS设置域分隔符 等于-F。
过滤出了/etc/passwd 文件中的第一列
[root@centos-1 ~]# awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
2.OFS 输出域分隔符。
我们可以改变文件内容的分割符号,并且打印出来
文件内容如下
[root@centos-1 ~]# cat abc
123 456
abc bcd
aaa bbb
[root@centos-1 ~]# awk 'BEGIN{OFS=","}{print $1,$2}' abc
123,456
abc,bcd
aaa,bbb
注意:这种情况需要多列,单列是不行的
3.NF 浏览记录的域的个数
打印出每行有几列
[root@centos-1 ~]# awk '{print NF}' abc
2
2
2
4.NR 已读的记录数
awk 读了几行内容
[root@centos-1 ~]# awk '{print NR}' abc
1
2
3
5、ORS 输出记录分隔符
awk规定,对于文本文件,默认情况下,一条记录对应一行,即记录之间的默认分隔符是换行符;而一条记录又可以分为多个字段,默认字段分隔符为空格。
[root@centos-1 ~]# cat abc
123
abc
aaa
[root@centos-1 ~]# awk 'BEGIN{ORS=","}{print $0}' abc
123,abc,aaa,[root@centos-1 ~]#
所以我们可以在编辑某些文件时,可以让文件内容横排显示,并且加上一定的分割符号
6.substr($n,n) 打印指定的列,并且从指定的第n个字符开始打印
substr($n,n,m) 打印指定的列,并且从指定的第n个字符开始打印,到m个字符停止
[root@centos ~]# awk 'BEGIN{FS=":"}{if(NR==1){print substr($NF,1)}}' /etc/passwd
/bin/bash
[root@centos ~]# awk 'BEGIN{FS=":"}{if(NR==1){print substr($NF,2)}}' /etc/passwd
bin/bash
[root@centos ~]# awk 'BEGIN{FS=":"}{if(NR==1){print substr($NF,3)}}' /etc/passwd
in/bash
过滤IP
[root@server2 ~]# ifconfig |awk '{if(NR==2){print substr($2,6,12)}}'
192.168.3.12
将第一行的每个字符后面加一个空格
[root@server2 ~]# awk 'BEGIN{ORS=" "}{if(NR==1){for(i=1;i<=length();i++){print substr($0,i,1)}print "\n"}}' /etc/passwd
r o o t : x : 0 : 0 : r o o t : / r o o t : / b i n / b a s h
7.将第二段的数字替换成行号
[root@centos6 ~]# cat abc
hshs a=1 jsjs
hds a=1 isi
hshppls a=1 jswyuwe
hyeyeushs a=1 jspppjs
h555shs a=1 jsjs888dh
hshggghs a=1 jshehhjs
hshhhhshes a=1jsjs7iii
hshshhsjs a=1 suuejejs
hshgewheues a=1 jejejsjs
hsujejeuhs a=1 77ieh2ssjs
[root@centos6 ~]# awk '{sub($2,"a="NR);print > "abc"}' abc
print > "abc":将更改后的数据重定向到源文件当中。文件名必须要用双引号引起来