资讯专栏INFORMATION COLUMN

AWK使用简介

caikeal / 1293人阅读

摘要:一简介如何展示文本内容,不在于修改文件,同样也是一行一行读入文件格式选项指明输入时用到的字段分隔符自定义变量模式匹配到相应的行,不标注时匹配整个文件匹配到匹配的行时,所要做的动作。

一:简介

如何展示文本内容,不在于修改文件,
同样也是一行一行读入文件
格式:
awk [options] ‘program’ file
option选项:

 -F  指明输入时用到的字段分隔符
 -v var=value   自定义变量

program模式: pattern{action .....}

 pattern:匹配到相应的行,不标注时匹配整个文件
 action: 匹配到匹配的行时,所要做的动作。常用的为打印 print printf(更复杂的打印时使用此选项)

eg:
awk –F: ‘{print $1,$2}’ /etc/passwd


awk -F: "{print $1" "$5}" /etc/passwd
“t” 表示tab键


awk -F: "{printf $1" "$5"n"}" /etc/passwd
printf 打印默认不支持换行,需要增加n

 谨记:printf 打印内容时,变量不加”” 。
 

二:awk变量(内置):

多练习方可熟练使用
配合 –v使用
FS:输入字段分隔符,默认为空白字符
awk-v FS=":" "{print $1,FS,$3}’ /etc/passwd
OFS:输出字段分隔符,默认为空白字符
RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效
ORS:输出记录分隔符,输出时用指定符号代替换行符
NF:字段数量
NR:行号
FNR:各文件分别计数,行号

FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数

以下为变量的各个使用举例:
bash中定义的变量在awd中同样可以直接拿来使用

1)FS OFS使用举例

2)RS ORS 记录分割符

NR 行号
FNR 各个文件 分别计数
NF 分割的字段数量,此变量可用于数组

   NF和$结合起来有更好的妙用
   $NF
   print里面同样支持数值运算
   

3)FILENAME:当前文件名

ARGC:命令行参数的个数,,,其中’program’ 不算参数
awk 和最后跟的文件才算参数,由以下例子可以看出此节

三:awk变量(自定义):

1)-v var=value

2) 在program中直接定义外部内部定义都OK

举例:
awk-v test="hello gawk" "{print test}" /etc/fstab
awk-v test="hello gawk" "BEGIN{print test}"
awk"BEGIN{test="hello,gawk";printtest}"
awk–F:‘{sex=“male”;print$1,sex,age;age=18}’ /etc/passwd

四:printf

在printf中未加”” 的字符串,printf都默认识别为变量
默认不换行,要换行加上n

1:格式匹配

格式:
格式要用””引起来
%c: 显示字符的ASCII码
%d,: 显示十进制整数
%f:显示为浮点数
%s:显示字符串
%%: 显示%自身
修饰符:
(#.#)第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-: 左对齐(默认右对齐)%-15s,,15表示宽度
+:显示数值的正负符号%+d
修饰符一般写在格式中间,为了进一步描述格式
格式和修饰符都是为了修饰后面变量打印的格式

应用举例:
1)格式
%s %d n 字符宽度的综合使用
左对齐宽度为25字符

2)增加字符串显示

2:操作符:

算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
赋值操作符:
=, +=, -=, *=, /=, %=, ^=
++, --
比较操作符:
==, !=,>, >=, <, <=
逻辑操作符:与&&,或||,非!
示例:
•awk –F: "$3>=0 && $3<=1000 {print $1}" /etc/passwd
•awk -F: "$3==0 || $3>=1000 {print $1}" /etc/passwd
•awk -F: ‘!($3==0){print $1}" /etc/passwd
•awk -F: ‘!($3>=500) {print $3}’ /etc/passwd

3:模式匹配符:

此块乃极为重要,说到底还是正则的熟练运用
~:左边是否和右边匹配包含!~:是否不匹配
匹配的内容使用 ”” 或// 框起来
awk–F: "$0 ~ /root/{print $1}‘ /etc/passwd
awk"$0~“^root"" /etc/passwd
awk"$0 !~ /root/‘ /etc/passwd
awk–F: ‘$3==0’ /etc/passwd

应用举例:
awk -F: "$0 ~ /root/{printf $0"n"}" /etc/passwd

正则表达式的写法:
awk -F: "$0 ~ /^root/{printf $0"n"}" /etc/passwd

模式匹配与操作符的综合使用:
awk -F: "$3>=500{printf $0"n"}" /etc/passwd

awk -F: "$3>=500&&$3<=1000{printf "%-25s %-20dn" ,$1,$3}" /etc/passwd


逻辑非时,后面的比较操作符要加()
awk -F: " !($3>=500){printf "%-25s %-20d " ,$1,$3}" /etc/passwd

4:条件表达式(三目表达式):

selector?if-true-expression:if-false-expression

四:PATTERN

awk 格式:
awk option ‘pattern{action}’ file
PATTERN:根据pattern条件,过滤匹配的行,再做处理,不匹配的行不做处理

1如果未指定:空模式,匹配每一行 2 /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

awk "/^UUID/{print $1}" /etc/fstab

             打印以UUID开头的行的 第一个字段

awk "!/^UUID/{print $1}" /etc/fstab
打印不以 UUID开头的行的 第一个字段

打印分区利用率

3 relational expression: 关系表达式,

结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
0和没有内容视作为0值

awk -F: -v n=0 "n++{printf "%-25s %sn",$1,$5}" /etc/passwd

     此例子很有意思,因为awk是一行一行处理,所以此次输出的结果是第一行没有,后面的行都有输出                  

注意:多次使用print打印,中间加;

不显示/etc/passwd中以/bin/bash结尾的行
1)awk -F: "$NF !="/bin/bash"" /etc/passwd


2)此写法使用~匹配符号
awk -F: "$NF !~/bash$/" /etc/passwd

4 line ranges:行范围

startline,endline:/pat1/,/pat2/不支持直接给出数字格式
一找到part1 的就开始打印 匹配到 part2 结束本次循环
再次找part1 开始打印 找到pqrt2结束 .......
eg:
awk "/^r/,/^h/" /etc/passwd
匹配到以r开头 至以h开头的行

awk "NR>=10&&NR<=20{print NR,$0}" /etc/passwd
打印第10行到第20行

5 BEGIN END

开头结尾打印,与其他没有关系
awk -F: "BEGIN{print "username uid"}NR>=10&&NR<=20{printf "%-20s %-10sn", $1,$3}" /etc/passwd

加上表头

awk -F: "BEGIN{print "username uidn-------------------------------"}NR>=10&&NR<=20{printf "%-20s %-10sn", $1,$3}END{print "---------------------------------"}" /etc/passwd

加上列:
awk -F: "BEGIN{print "username uidn-------------------------------"}NR>=10&&NR<=20{printf "%-20s |%-10sn", $1,$3}END{print "---------------------------------"}"

六:控制语句

常用:action

1)算术运算,比较表达式

2)控制语句,if while for

3) print

常用 控制语句:

1){statement;........}

2) if(条件判断){命令}

3)if(条件判断){命令}else {命令}

4)while(条件){命令}

5)for(1,2,3){命令}

6) break continue

1 if else使用举例

格式:
if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}

举例 /ets/fstab 一行中 字段数多于5个的打印

2 while 循环

awk中内置循环,while用于行中的循环处理
举例:

1)取出每个单词,并输出其长度

awk -F: "{i=1;while(i<=NF){print $i,length($i);i++}}" /etc/passwd

2)取出以root开头行,,并输出其长度,及每个单词

awk -F: "/^root/{i=1;while(i<=NF){print $i,length($i);i++}}" /etc/passwd

3)取出以root开头行,,并输出每个单词,单词长度要大于5个字母
awk -F: "/^root/{i=1;while(i<=NF){if(length($i)>=4)print $i,length($i);i++}}" /etc/passwd

3 for循环

格式:for(1,2,3){4}

特殊用法是:遍历数组中的元素,后续介绍

4 break, continue的使用

break 中断循环;continue,跳出此次循环,进行下一次循环

七:AWK数组

awk使用的数组为关联数组
awk常常使用for循环来遍历数组中的元素
举例:

1 重复的行不打印
awk ‘!arr[$0]++’ f1

此语句中先行运行取反操作,再执行++命令,再去打印,最后再给arr[$0] 加1

2)使用for循环遍历数组
格式:for(var in arr){action }

     var会遍历arr数组的每一个索引

遍历 ss –nat连接状态出现的次数

 ss -nat|awk "!/^State/{arr[$1]++}END{for(i in arr){print i,arr[i]}}"
 arr[$1]++: $1代表第一字段,++代表第一字段相同时加1
 for(i  in arr):i遍历数组arr的下标,并把下标的值赋给变量i
 另外此块很重要的另外一部分在于语法书写的格式,这个在于多写多练,写的多了,熟练之后,自然出错的地方就会越来越少

ss -nat|awk "!/^State/{arr[$1]++}END{for(i in arr){print i,arr[i]}}"

八:函数 1 数值处理

rand():返回0和1之间的随机数,但要配合srand使用
格式: srand()相当于种子,先调用srand() rand()方能生效
eg:
1 :生成0到1之间的随机数
awk ‘BEGIN{print srand(),rand()}’

2:生成1-100之间的随机整数
awk "BEGIN{srand();print int(rand()*100)}" int可以定义输出为整数

3:生成10个1-100之间的随机整数
awk "BEGIN{srand();for(i=0;i<=10;i++){print int(rand()*100)}}"

2 字符串处理

1:length([s]):返回指定字符串的长度

2:sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s
eg:字符串中的:用-来进行替代。模式匹配时注意加上//
echo "ac:d:e:f:g"|awk "sub(/:/,"-",$0)"

  echo "a:b:c:d:e:f:g"|gawk "sub(/:/,"-",$0)" 

3 gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
全局替换,例子在2中

4 split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…
eg:统计netstat –ant 中外部ip地址出现的次数
netstat -ant|awk "/^tcp>/{split($5,arr,":");count[arr[1]]++}END{for(i in count){print i,count[i]}}"

3 自定义函数

格式:
function name ( parameter, parameter, ... ) {
statements
return expression
}

eg:#cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}

$awk -f fak.awk

九:awk调用shell中的命令

1 使用system命令
2 除了awk中定义的变量,其他全用””括起来
eg:
awk ‘BEGIN{system("hostname") }"
awk"BEGIN{score=100; system("echo your score is " score) }"

十:实例 1 求平均值
awk -F " " "{sum+=$1} END {print sum/NR}"  a.txt

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24945.html

相关文章

  • 三剑客之AWK

    摘要:使用中,需要处理的文件,逐行使用分隔符分割成若干个字段,称之为域,分隔符默认是空格,可使用选项来指定分隔符脚本模式将所需执行的命令插入脚本文件,然后在首行设置命令解释器为通过键入脚本名的方式调用。 博文参考 http://www.178linux.com/6553 http://baike.baidu.com/link?url=Y4lo-kWxygpw7NLaKTSehvpkAM7og...

    csRyan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<