欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux的awk命令

程序员文章站 2022-06-01 14:14:30
...

一、参考链接

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命令形式:
 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命令作用是列出文件系统的整体磁盘空间使用情况。可以用来查看磁盘已被使用多少空间和还剩余多少空间。示例如下:

linux的awk命令

    2.1.2 使用df命令将系统磁盘的使用情况打印出来,使用df | awk '{print $5}' 命令打印第5列(Capacity)的内容。    

linux的awk命令

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指令输出指定列的内容。

    将自己想要添加的字段写在文件中,可以按照如下做法:

    * 将字符进行拼接,或者将一个字符当作新的列进行插入操作

linux的awk命令linux的awk命令

    如果在$1字符上加上双引号“”,则将会打印其地址信息。

linux的awk命令

三、awk特殊模式

    3.1.1 awk的两种特殊模式Begin和End。Begin模式指定了处理文本之前需要执行的操作;而End模式指定了处理完所有行之后需要执行的操作。

linux的awk命令

四、awk的分隔符

    4.1.1 如果不指定分隔符的话,则awk默认使用的分隔符为空格。首先使用-F选项,指定分隔符。如下图,使用“-F#”指定使用“#”作为分隔符。

linux的awk命令

    通过awk内置变量FS指定分隔符,但是在使用的时候,要在前面添加-v选项,如下图示例,“-v FS='#'

linux的awk命令

    awk通过OFS选项指定输出格式,按照指定的格式输出到标准输出流。如下图,“-v OFS='+++'

linux的awk命令

linux的awk命令

    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命令显示此行有几个字段

linux的awk命令 

    将行内容全部输出($0),使用NR命令输出行号。

linux的awk命令

    使用FNR命令,会分别将每个文件分开计数行号。如下图。

linux的awk命令

    使用-v RS=“ ”命令,以空格作为行分隔符,效果如下图所示。

linux的awk命令

    输出指令-v ORS="+++"将换行符转换层“+++”进行输出。

linux的awk命令

    FILENAME指令用来输出文件名称。

linux的awk命令

    ARGV内置变量表示的是一个数组,数组中保存的是命令行所给定的参数,数组下标都是从0开始的,此处,ARGV[0]表示的是awk命令。

linux的awk命令

    ARGV代表数组,而ARGC代表数组的长度,也即是参数的个数。

linux的awk命令

    5.3 awk的自定义变量

    定义自定义变量有两种方式:

    方法一:-v varname=value ,变量名字符区分大小写。

    方法二:在program中直接定义。

    通过方法一自定义变量,如下图:

linux的awk命令

    通过方法二自定义变量,变量定义与动作之间用分号“ ;”隔开,如下图:

linux的awk命令

六、awk的格式化操作

    print输出操作会输出换行符,而printf输出操作不会输出换行符,默认会将文本输出在一行里面。使用指定的格式符进行操作,如“%s\n”,指定换行符(\n)。

linux的awk命令

    当传入多个参数时,这多个参数可重复的使用同一个格式替换符。printf指令与printf动作唯一区别是,printf动作需要使用逗号“ ,”将列之间隔开,而printf指令则不需要添加隔开符号。

linux的awk命令

    在awk中使用printf动作时,需要注意:

(1)使用printf动作时输出文本不会换行,如果需要进行换行,则需要在对应的“格式替代符”后加入“\n“进行转义;

(2)使用printf动作时,“指定的格式”与“被格式化的文本”之间,需要用逗号“ ,”隔开;

(3)使用printf动作时,格式中的“格式替代符”必须与文本一一对应。

七、awk动作详解

    在awk中有许多的动作指令,其中最常用的就是if…else if…else…语句,这与常用的编程语言中的条件判断语句用法相同,也是控制语句的一种,当然也有for循环和while循环、continue、break两种格式,不过在使用的过程中要注意"{"、"}"的使用。exit命令表示退出当前脚本,如果有END指令,则直接跳到END指令执行。

八、awk中的数组

    awk中的数组可以直接进行赋值,无需进行声明。元素的值可以为空字符串。当数组中不含要打印的字符串时,强行输出,会造成输出空字符串的情况出现,并且直接引用这个不存在的元素,会直接输出空字符串,如下图所示,    linux的awk命令

    使用delete可以直接删除数组中的元素。

linux的awk命令

九、awk常用内置函数

    使用rand()函数生成随机数字,但是要和srand()函数配合使用,否则返回的值将一直不变。

linux的awk命令

    gsub()或sub()函数用来替换文本中的字符。length()获取指定字符串的长度。index()函数获取指定字符在字符串中出现的位置。split()函数使用指定符号分隔字符串,形成数组。asort()函数根据元素的值进行排序

    后续待补充!!!

相关标签: awk