今天介绍Linux常见的一个命令awk,一门模式匹配的编程语言,因为它的主要功能是用于匹配文本并处理,同时它有一些编程语言才有的语法,例如函数、分支循环语句、变量等等。当然比起我们常见的编程语言,awk相对比较简单,那我们就一起看看吧。 awk 一 命令 awk处理过程: 依次对每一行进行处理,然后输出。 awk命令形式: awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file [-F|-f|-v] -F指定分隔符,-f调用脚本,-v定义变量 var=value ' ' 引用代码块 BEGIN 在逐行处理之前初始化代码,主要是引用全局变量,如FS设置分隔符等 // 匹配代码块,可以是字符串或正则表达式 {} 命令代码块,包含一条或多条命令 ; 多条命令使用分号分隔 END 在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息 二 各个命令注解 实例文件for_awk.txt内容如下: 2.1 -f 指定脚本文件 script.awk:内容如下 BEGIN{ FS=':' } {print $1} Ps:效果与awk 'BEGIN {FS='\t'}{print $1}' for_awk.txt相同。 2.2 -F 指定分隔符 $1 指定分隔符后,第一个字段,$0全部字段。 上面的例子也可以使用: # 打印以”\t”为分割符的第一个字段 # 1.注意观察下面两个例子: 细心的你一定发现,在 $1和$2之间增加‘,’输出的内容之间也增加一个空格作为分隔符。 # 2. 指定OFS=’\t’设置输出各个字段符分隔符,本例以制表符作为分割。 也可以自定义输出,注意引号的使用。 #3. NF:表示每行有的字段数,注意这里的字段数是被–F分割后的部分数。 # 4. NR:表示当前行的行号。 2.3 –v设置变量 2.4 // 匹配代码块 // 纯字符匹配 !// 纯字符不匹配 ~// 字段值匹配 !~// 字段值不匹配 ~/a1|a2/ 字段值匹配a1或a2 # 1.纯字符(不)匹配 注:匹配含有指定字符’lisi’的行。 注:匹配不含有指定字符’lisi’的所有行。 # 2.字段值(不)匹配 注:指定字段’$4’匹配含有指定字符’107'的所有行。 注:指定字段’$4’匹配不含有指定字符’107’的所有行。 # 3.正则表达式在匹配中的应用 注:指定字段’$4’匹配指定字符’107’或’108’的所有行。 注:结合正则表达式使用。 2.5 IF 语句 整个if语句必须用在{}中,且比较内容用()扩起来 # 1.第一个字段匹配’wanger’,打印整行,否则,打印”None” # 2.输出文件的空白行 注:^$ 正则表达式使用。^表示行首;$表示行尾。 # 3.某文件夹下所有文件的大小 2.6 条件表达式 == 相等 != 不等 > 大于 >= 大于等于 <小于>小于><=>=> # 1.打印姓名为lisi的学号 # 2.打印学号为201802及以后的学号的姓名 注:不知道你是不是发现了第一行是”Name”字段也被输出了,这是为啥呢?原来字母和数字进行比较,会按照ASCII码的大小进行比较。因此,这里要提醒使用条件表达式时,被比较的字段的数据类型最好一致。 2.7 逻辑运算符 && || # 1. 打印学号为201802及以后的学号的以”w”开头的姓名 # 2. 打印学号为201802以后的学号的姓或”w”开头的姓名 2.8 数值运算 减法乘除,幂,取整等【+, -, *, /, **, int()】 应用1 awk -F'[\t#]' '{print NF}' for_awk.txt # 指定多个分隔符\t,#,输出每行多少字段 awk -F'[\t#]' '{print $1,$2 }' OFS='\t' for_awk.txt # 制表符分隔输出多字段 应用2 打印输出第一个字段出现次数为1次的字段。 思考:出现的次数大于1次呢? awk -F '\t' '{print $1}' for_awk.txt |sort|uniq -c|grep –v '1' 满满的收获 通过上面的介绍,你是不是get到这项技能了呢? 如果还不太熟悉,那就新建一个类似的文档,练习起来吧! 另外,awk是逐行处理工具,若需要更复杂的文本处理,建议使用脚本语言处理。 供稿:刘利峰 编辑:鲁淑妮 |
|