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 " "}}' /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":将更改后的数据重定向到源文件当中。文件名必须要用双引号引起来

原文地址:https://www.cnblogs.com/pangbing/p/6918202.html