AWK 字符串处理

字符串处理的另外一个强大的工具是AWK, 与SED不同的是AWK更加擅长对字符串进行切分, 进行列处理。

语法

awk [ -F re] [parameter…] [‘prog’] [-f progfile]
参数说明:
-F re:允许awk更改其字段分隔符,默认是空格。
parameter: 该参数帮助为不同的变量赋值。
‘prog’: awk的程序语句段。这个语句段必须用单拓号:’和’括起,以防被shell解释。 这个程序语句段的标准形式为:’pattern {action}’
-f progfile: 满足AWK语法的程序文件;

常用的内置变量

FIELDWIDTHS

以空格分隔的字段宽度,如果指定此变量,awk将会用指定的宽度替换变量FS指定的分隔符。

echo "abcdefghijkl" | awk 'BEGIN {FIELDWIDTHS="2 3 4"}'
输出: ab cde fghi
NF

当前记录中的字段个数。

NR

已经读出的记录数。

FILENAME 文件名
OFS

输出字段分隔符, 默认也是空格,可以改为制表符等

ORS

输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

内置函数

gsub(r,s)在整个$0中用s代替r
gsub(r,s,t)在整个t中用s替代r
index(s,t)返回s中字符串t的第一位置
length(s)返回s长度
match(s,r)测试s是否包含匹配r的字符串
split(s,a,fs)在fs上将s分成序列a
sprint(fmt,exp)经fmt格式化后的exp
sub(r,s)用$0中最左边最长的子串代替s
substr(s,p)返回字符串s中从p开始的后缀部分
substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分

常用实例

基本输出格式
awk  -F: '{print $1,$3,$6}' OFS="\t" file_name 

以:为分隔符, 输出字段1,3,6,以制表符作为分隔符

awk -F: 'NR==4 || NR==8{print}'  file_name      

显示第5行和第6行

正则匹配输出

//纯字符匹配 !//纯字符不匹配 ~//字段值匹配 !~//字段值不匹配 ~/a1|a2/字段值匹配a1或a2

awk '/mysql/{print $0}' file_name

显示匹配“mysql”的整行输出

awk '!/mysql/{print $0}' file_name

显示匹配“mysql”的整行输出

awk -F: '$1!~/mail|mysql/{print $1}'  file_name
awk -F: '{if($1!~/mail|mysql/)print $1}'  file_name

字段1匹配mail或者mysql才显示字段1.

begin … end
awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}' file_name

先执行BEGIN,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域, 0, 0 则 表 示 所 有 域 , 1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

print和printf 格式输出

打印输出时,可能需要指定字段间的空格数,从而把列排整齐。在print函数中使用制表符并不能保证得到想要的输出,因此,可以用printf函数来格式化特别的输出。

格式说明符功能
%c打印单个ASCII 字符
%d打印一个十进制数
%e打印数字的e 记数法形式
%f打印一个浮点数
%o打印数字的八进制
%s打印一个字符串
%x打印数字的十六进制值
-左对齐修饰符
#显示8 进制整数时在前面加个0,显示16 进制整数时在前面加0x
+显示使用d 、e 、f 和g 转换的整数时,加上正负号+或-
0用0而不是空白符来填充所显示的值
awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}'  file_name
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值