AWK 字符串处理

版权声明:本文为博主原创文章,如果转载请注明,谢谢。 https://blog.csdn.net/baijiwei/article/details/81623394

字符串处理的另外一个强大的工具是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,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
展开阅读全文

没有更多推荐了,返回首页