工作生活

shell编程之awk

2019-06-30  本文已影响0人  hemingkung

/***************************************************************************/
awk的内置变量


awk 'BEGIN{}pattern{command}END{}'

总结:内置变量
$0                    打印出行所有信息
awk '{print $0}' /etc/passwd

$1-$n                 打印行的第1到n个字段的信息
awk 'BEGIN{FS=":"}{print $1}' /etc/passwd

NF (Number Field)       处理行的字段个数
awk '{print NF}' list

NR (Number Row)         处理行的行号
awk '{print NR}' list /etc/passwd  后面指定的文件行数累加

FNR (File Number Row)   多文件处理时,每个文件单独记录行号
awk 'print FNR' list /etc/passwd

FS  (Filed Separator)   字段分割符,不指定时默认以空格或tab键做分割
awk 'BEGIN{FS="|"}{print $2}' list

RS                    行分割符,不指定时以回车换行分割
awk 'BEGIN{FS="|";RS="---"}{print $2}' list

OFS (Output Filed Separator)                  输出字段分割符
awk 'BEGIN{RS="--";FS="|";ORS="&";OFS=":"}{print $1,$3}' list

ORS  (Output Row Separator)                 输出行分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $3}' list

FILENAME              处理文件的文件名
awk '{print FILENAME}' list

ARGC                  命令行参数的个数
awk '{print ARGC}' list

ARGV                  命令行参数数组



awk格式化输出之printf总结
%s     打印字符串


%d     打印10进制数


%f     打印浮点数


%x     打印16进制数


%o     打印8进制数


%e     打印数字的科学计数法格式


%c     打印单个字符的ASCII码



修饰符
-    左对齐
+    右对齐
#    显示8进制在前面加0 显示16进制在前面加0x


格式示例:

1、以字符串格式打印/etc/passwd中的第七个字段
awk 'BEGIN{FS=":"}{printf "%s",$7}' /etc/passwd

2、以10进制格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%d\n",$3}' /etc/passwd

3、以浮点数格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%f\n",$3}' /etc/passwd

4、以16进制数格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%x\n",$3}' /etc/passwd

5、以8进制格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%o\n",$3}' /etc/passwd

6、以科学计数法格式打印/etc/passwd中的第三个字段,以":"作为分隔符
awk 'BEGIN{FS=":"} {printf "%e\n",$3}' /etc/passwd


修饰符示例:
1左对齐格式
2右对齐格式
3打印8进制或者16进制是在前面加#


/********************************************************************************/
awk模式匹配用法总结:
①、RegExp
②、运算符匹配

1、RegExp
匹配/etc/passwd文件中含有root字符串的所有行
awk 'BRGIN{FS=":"}/root/{print $0}' /etc/passwd

匹配/etc/passwd文件行中以yarn开头的所有行
awk 'BRGIN{FS=":"}/^yarn/{print $0}' /etc/passwd

2、运算符匹配

关系运算符匹配

<        小于
>        大于
<=       小于等于
>=       大于等于
==       等于
!=       不等于
~        匹配正则表达式


1、以:为分隔符,匹配/etc/passwd文件中第3个字段小于50的所有行信息
awk 'BEGIN{FS=":"}$3<50{print $0}' /etc/passwd

2、以:为分隔符,匹配/etc/passwd文件中第3个字段大于50的所有行信息
awk 'BEGIN{FS=":"}$3>50{print $0}' /etc/passwd

3、以:为分隔符,匹配/etc/passwd文件中第7个字段为/bin/bash的所有行信息
awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' /etc/passwd

4、以:为分隔符,匹配/etc/passwd文件中第7个字段不为/bin/bash的所有行信息
awk 'BEGIN{FS=":"}$7!="/bin/bash" /etc/passwd

5、以:为分隔符,匹配/etc/passwd文件中第3个字段包含3个以上数字的所有行信息
awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' /etc/passwd

布尔运算符匹配
||     或
&&     与
!     非

1:以:分隔符,匹配/etc/passwd文件中包含hdfs或者yarn的所有行信息
awk 'BEGIN{FS=":"}$1=="hdfs"||$1=="yarn"{print $0}' /etc/passwd

2:以:分隔符,匹配/etc/passwd文件中第三个字段小于50并且第四个字段大于50的所有行信息
awk 'BEGIN{FS=":"}$3<50 && $4>50{print $0}' /etc/passwd

awk的基本运算

+           加
-           减
*           乘
/           除
%           取模
^或**       乘方
++x         在返回x变量之前,x变量加1
x++         在返回x变量之后,x变量加1
--x         在返回x变量之前,x变量减1
x--         在返回x变量之后,x变量减1

1 使用awk计算/etc/services中空白的行数量


2 计算学生课程分数的平均值 学生课程文件如下


3 使用awk输出/etc/passwd文件的行数 分两种方式进行显示行数 


上一篇下一篇

猜你喜欢

热点阅读