linux的awk命令
一、参考链接
awk命令可参考:https://www.cnblogs.com/xudong-bupt/p/3721210.html
http://www.zsythink.net/archives/1336
二、awk介绍
awk是一个文本分析工具,简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk是一门编程语言,支持条件判断、数组和循环等功能,所以,可以把awk理解为一个脚本语言解释器。
grep、sed和awk被称为linux中的“三剑客”,其中,
grep适合单纯的查找或者匹配文本;
sed适合编辑匹配到的文本;
awk适合格式化文本,对文本进行较复杂的格式化处理。
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
2.1 awk基础学习:
2.1.1、首先使用echo向testd中写入“ddd”字符串,然后使用awk命令将文件中的内容输出。
echo中的重定向:能够把内容输出到文件里而不是标准输出
Mine-Wyao:~ sf$ echo ddd > testd
Mine-Wyao:~ sf$ awk '{print}' testd
ddd
df
命令作用是列出文件系统的整体磁盘空间使用情况。可以用来查看磁盘已被使用多少空间和还剩余多少空间。示例如下:2.1.2 使用df命令将系统磁盘的使用情况打印出来,使用df | awk '{print $5}' 命令打印第5列(Capacity)的内容。
Mine-Wyao:~ sf$ df | awk '{print $NF}'
on # 使用 $NF指令打印最后一列的内容。
/ # NF表示分割后,一共有几个字段。
/dev
/net
/home
Mine-Wyao:~ sf$
特殊要点:
$0 表示整个当前行
$n 每行第n个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符
|
awk逐行处理文本,按照指定的分隔符,将行分割为多个字段,如果没有指定分隔符,默认使用空格作为分隔符,每个字段按照顺序,分别对应到awk的内置变量中,比如,分割完的第一个字段为$1,第二个字段为$2,依次类推,用$0表示当前处理的整个一行。使用awk '{print $1,$2}' testd指令输出指定列的内容。
将自己想要添加的字段写在文件中,可以按照如下做法:
* 将字符进行拼接,或者将一个字符当作新的列进行插入操作
如果在$1字符上加上双引号“”,则将会打印其地址信息。
三、awk特殊模式
3.1.1 awk的两种特殊模式Begin和End。Begin模式指定了处理文本之前需要执行的操作;而End模式指定了处理完所有行之后需要执行的操作。
四、awk的分隔符
4.1.1 如果不指定分隔符的话,则awk默认使用的分隔符为空格。首先使用-F选项,指定分隔符。如下图,使用“-F#”指定使用“#”作为分隔符。
通过awk内置变量FS指定分隔符,但是在使用的时候,要在前面添加-v选项,如下图示例,“-v FS='#'”
awk通过OFS选项指定输出格式,按照指定的格式输出到标准输出流。如下图,“-v OFS='+++'”
4.2.2 awk '{print $1 $2}' (没有逗号分隔)表示每行分隔后,将第一个字段和第二个字段连接在一起进行输出。
awk '{print $1,$2}' (有逗号进行分隔)表示将第一列和第二列以输出分隔符分隔输出。
五、awk的常用变量操作
5.1 对于awk来说,变量分为内置变量和自定义变量。内置变量就是预定义好、安置在awk内部的可直接使用的变量。而自定义变量就是用户自定义的变量。
awk常用的内置变量如下所述,
FS | 输入字段分隔符,默认为空白字符。(空格) |
OFS | 输出字段分隔符,默认为空白字符。(空格) |
RS | 输入记录分隔符(输入换行符),指定输入时的换行符。 |
ORS | 输出记录分隔符(输出换行符),输出时用指定符号代替换行符。 |
NF | Number Of Field,当前行的字段的个数,(当前行被分成了几列),字段数量。 |
NR | 行号,当前处理的文本行的行号。 |
FNR | 各文件分别计数的行号。 |
FILENAME | 当前文件名。 |
ARGC | 命令行参数的个数。 |
ARGV | 数组,保存的是命令行所给定的各参数。 |
5.2 使用awk内置的NR命令显示行号,使用NF命令显示此行有几个字段
将行内容全部输出($0),使用NR命令输出行号。
使用FNR命令,会分别将每个文件分开计数行号。如下图。
使用-v RS=“ ”命令,以空格作为行分隔符,效果如下图所示。
输出指令-v ORS="+++"将换行符转换层“+++”进行输出。
FILENAME指令用来输出文件名称。
ARGV内置变量表示的是一个数组,数组中保存的是命令行所给定的参数,数组下标都是从0开始的,此处,ARGV[0]表示的是awk命令。
ARGV代表数组,而ARGC代表数组的长度,也即是参数的个数。
5.3 awk的自定义变量
定义自定义变量有两种方式:
方法一:-v varname=value ,变量名字符区分大小写。
方法二:在program中直接定义。
通过方法一自定义变量,如下图:
通过方法二自定义变量,变量定义与动作之间用分号“ ;”隔开,如下图:
六、awk的格式化操作
print输出操作会输出换行符,而printf输出操作不会输出换行符,默认会将文本输出在一行里面。使用指定的格式符进行操作,如“%s\n”,指定换行符(\n)。
当传入多个参数时,这多个参数可重复的使用同一个格式替换符。printf指令与printf动作唯一区别是,printf动作需要使用逗号“ ,”将列之间隔开,而printf指令则不需要添加隔开符号。
在awk中使用printf动作时,需要注意:
(1)使用printf动作时输出文本不会换行,如果需要进行换行,则需要在对应的“格式替代符”后加入“\n“进行转义;
(2)使用printf动作时,“指定的格式”与“被格式化的文本”之间,需要用逗号“ ,”隔开;
(3)使用printf动作时,格式中的“格式替代符”必须与文本一一对应。
七、awk动作详解
在awk中有许多的动作指令,其中最常用的就是if…else if…else…语句,这与常用的编程语言中的条件判断语句用法相同,也是控制语句的一种,当然也有for循环和while循环、continue、break两种格式,不过在使用的过程中要注意"{"、"}"的使用。exit命令表示退出当前脚本,如果有END指令,则直接跳到END指令执行。
八、awk中的数组
awk中的数组可以直接进行赋值,无需进行声明。元素的值可以为空字符串。当数组中不含要打印的字符串时,强行输出,会造成输出空字符串的情况出现,并且直接引用这个不存在的元素,会直接输出空字符串,如下图所示,
使用delete可以直接删除数组中的元素。
九、awk常用内置函数
使用rand()函数生成随机数字,但是要和srand()函数配合使用,否则返回的值将一直不变。
gsub()或sub()函数用来替换文本中的字符。length()获取指定字符串的长度。index()函数获取指定字符在字符串中出现的位置。split()函数使用指定符号分隔字符串,形成数组。asort()函数根据元素的值进行排序
后续待补充!!!