码迷,mamicode.com
首页 > 系统相关 > 详细

Linux的awk命令简单操作

时间:2018-07-04 10:30:48      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:index   tab   regular   rand   else   计数   ash   逗号   整数   

awk是一个编程工具,他有完整的语法和命令。在bash中,awk更多的用于处理列内容(我是这么认为的,仅供参考)

awk程序的执行逻辑

      首先将文本内容读入到内存中,根据字段分隔符,在读取文本内容的过程中把读入的内容分段,第一个字段对应$1,第二个字段对应$2,依次类推,$0代表所有的字段。

注意:

      1、在awk程序中,变量的使用不需要带$符号,因为$符号表示字段。

      2、整个执行语句必须被'{}'包裹。

      3、awk程序,在处理文本的时候是一次处理一行内容。


先简单演示一下

技术分享图片

技术分享图片

这个例子中,awk程序将文本内容中的第二列和第四列进行了输出。

技术分享图片

这个例子主要是证明,awk每次处理一行内容。在例子中,awk处理了两行内容,所以hello输出的两次。字段之间用逗号隔开。

技术分享图片

这个例子中,hello与$2之间没有逗号,所以输出的内容中hello与$2所代表的的内容连在一起。

技术分享图片

这个例子中print后面没有跟任何参数,所以这个例子证明,print默认是输出所有内容


选项:

-F 指明输入时用到的字段分隔符

技术分享图片

这个例子中-F 指定了分隔符是:


变量

如果要使用变量就要使用-v这个选项

内建变量FS  这个等价于-F 读入文件时的分隔符 默认使用空白字符作为分隔符

技术分享图片


内建变量 OFS awk在输出时默认使用空白字符作为分隔符,也可以通过OFS进行指定



原本空白的地方被@替换了


内建变量RS,awk的在读入内容是的换行符,遇到这个符号就换行。默认使用\n作为换行符

技术分享图片

原本一行的内容被拆分成了若干行


内建变量ORS,awk在输出内容时默认使用\n作为换行符,也可以进行改变

技术分享图片

技术分享图片

这个例子中,需要注意的是每一个变量之前必须有一个-v的选项,不然系统会报错。

原本需要换行的输出,由于换行符改为#号,所以#号代替了换行。


内建变量NF 表示每一行字段的数量

技术分享图片

awk默认以空白符作为分隔符,/etc/passwd的每行内容基本上没有空白字符,所以一行就是一个分段。

技术分享图片

在读入文本内容时,以冒号作为分隔符,每一行被分为7段,那么NF就等于7


内建变量NR 打印读入内容的行编号

技术分享图片

如果有多个文件,那么awk默认会把所有内容看做一个文件


内建变量FNR 可以让awk分别对每个文件进行处理

技术分享图片

技术分享图片


内建变量FILENAME 每处理一行就输出内容所在文件的文件名

技术分享图片

内建变量ARGC 命令行参数的个数 输入的执行命令

技术分享图片

2表示执行的命令中有两个参数,更准确的说法是执行命令的字符串的个数是2:1、awk  2、/etc/issue


内建变量ARGV 这是个数组名,数组用来保存命令行中的参数

技术分享图片


自定义变量

awk本身就是一个编程工具,所以它支持自定义变量,

技术分享图片

这种变量赋值算一种提前赋值的方式,因为赋值的动作在执行命令之前。

技术分享图片

这种变量赋值算另一种赋值方式,赋值的动作在执行命令过程中


printf

这个命令的主要功能就是对输出内容进行制表操作,让输出的内容看起来更加美观

printf FORMAT,item1,item2

注意:1、printf没有默认格式,FORMAT必须给出。 2、printf不会自动换行,需要输出换行符 3、FORMAT需要为后面每一个需要输出的字段指定格式化符号(是以整数输出,还是字符串输出)

格式符:

           %c 显示为字符的ASCII码

           %d,%i 显示为十进制整数

           %f 显示为浮点数

           %g %G 以科学计数法或浮点形式显示数值

           %s 显示字符串

           %u显示为无符号整数

           %% 显示%自身

技术分享图片

printf 需要输出的内容需要用双引号引起来。

$1的内容需要用%s(字符串格式显示)

现在换一个显示格式

技术分享图片

相同的内容,显示格式不一样,输出就可能不一样

为了让输出内容更有可读性,我再改改

技术分享图片

技术分享图片

$1以%s的格式输出,$3以%d的格式输出,这是语法。


修饰符

#[.#] 第一个#号控制显示的宽度,第二个#号表示小数点后的精度

技术分享图片

%7s:默认表示右对齐,7表示$1输出的字符串的长度,

技术分享图片

%-7s:负号表示左对齐,如果有+号表示的不是右对齐,+号表示数值的正负属性。

操作符

awk支持算术运算。

x+y加法  x-y减法   x*y 乘法  x/y 除法  x^y   x%y余运算

-x 把数值变成负数

+x 把字符串转换为数值

 

字符串操作符

没有符号的操作符,表示字符串连接

 

赋值操作符

=  

+=   sum=sum+i  sum+=i

-=   sum=sum-I   sum-=i

*=   sum*=y  sum=sum*y

/=   sum/=y  sum=sum/y

%=   sum%=y sum=sum%y

^=   sum^=y sum=sum^y

++i 是参与运算之前先让i+1

i++ 是参与运算之后再让i+1

- - 同理

 

比较操作符

>    >=    <   <=    !=    ==

 

模式匹配符

~ 左侧的字符串是否被右侧的模式(关键字)所匹配 

!~ 左侧的字符串是否不能被右侧的模式(关键字)所匹配

 

逻辑操作符

&&

||

!

因为awk本身就是一个编程工具,所以其他编程工具有的功能,它基本都有


函数调用

内置函数rand ()

技术分享图片

这里不是要解释rand()函数,而仅仅是演示函数的调用

内置函数length() 返回指定字符串的长度

内置函数split(s,a,[r]) 以r为分隔符切割s字符串,并将切割后的结果保存在a所表示的数组中。


条件表达式

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

selector表达式是否为真,真的话执行true语句,假的话执行false语句


PATTERN

类似于地址定界的功能

1、empty 空模式 匹配任意行,全内容处理

2、/regular expression/ 使用正则表达式匹配文件中的行,仅处理匹配到的行

3、relational expression 关系表达式,结果有真 有假。结果为真才会被处理。真:结果为非0值,非空字符串为真,空字符串为假。

4、line ranges 行范围 指定起始和结束行,可以使用匹配方式指定,还可以使用数字,不过要借用NR变量。

5、BEGIN\END

      BEGIN{命令行}:仅在处理文件中的文本之前执行一次

      END{命令行}:仅在处理文件中的文本之后执行一次


常用的action

1expressions awk自己的语句

2Control statements 比如 if while 控制语句

3Compound statements组合语句

4input statements 输入语句

5output statements 输出语句

 

控制语句

if(condition){statements}

if(condition){statements} else {statements}

 

while(condition){statements}

 

do{statements}while(condition)

 

for(expr1;expr2) {statements}

 

switch(expr1) {case VALUE1 or /REGEXP1/:statement;case VALUE2 or /REGEXP2/:statement;defaultstatement}

switch类似于case 多分支 可以匹配值也可以模式匹配

 

break [n] 跳出n层循环

 

continue 停止本轮循环,继续下轮循环

 

next     awk是对文件中的每一行进行处理,next是让awk提前结束当前行的处理,继续进行下一行的处理。

 

delete array[index]

 

delete array

 

exit

 

数组

array[index-expression]

index-expression

   1、可使用任意字符串

   2、如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为空串。

若要判断数组中是否存在某元素,要使用”index in array”格式进行

Weekdays[“mon”]=”Monday”

若要遍历数组中的元素,需要使用for循环


来练习练习

1、将用户的ID做比较,UID大于1000的就是普通用户,小于1000的就是系统管理员或者系统用户

技术分享图片

2、仅处理/etc/fstab中以UUID开头的行

技术分享图片

3、仅处理不以UUID开头的行

技术分享图片

4、将用户ID作比较,UID大于1000的用户显示出来

技术分享图片

5、将/etc/passwd中bash为/bin/bash的用户显示出来

技术分享图片

技术分享图片

6、显示/etc/passwd的前10行的username和UID的行

技术分享图片

技术分享图片

技术分享图片

7、第6个例子使用printf来做

技术分享图片

8、第4个例子用awk if语句实现

技术分享图片

9、练习if  else语句

技术分享图片

10、如果用户的shell为/bin/bash,那么就输出用户名

技术分享图片

11、如果分区的使用率大于40,就显示该分区

技术分享图片

12、为指定行计算每一行的每一个字段的字符数

技术分享图片

13、在第12个例子上加个难度。小于7个字符的字符串不需要输出

技术分享图片


Linux的awk命令简单操作

标签:index   tab   regular   rand   else   计数   ash   逗号   整数   

原文地址:http://blog.51cto.com/yueyue207/2135823

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!