内容简介:awk 使用正则表达式过滤文本时可以使用可变参数,我本认为这应该是很普遍的需求,然而网上找了一圈也没看到一个比较全面的教程,不过东拼西凑也总算是满足了需求,今天来总结下。首先将当前文件列表导入到一份文本文件
awk 使用正则表达式过滤文本时可以使用可变参数,我本认为这应该是很普遍的需求,然而网上找了一圈也没看到一个比较全面的教程,不过东拼西凑也总算是满足了需求,今天来总结下。
首先将当前文件列表导入到一份文本文件 text 中,作为测试使用
$ ll > text
命令行传参
首先我们打算过滤文件列表的最后修改时间为 10
点的数据
$ awk '/10/ {print $0}' text -rw-r--r-- 1 wxnacy staff 1052 Mar 13 22:50 awktest -rw-r--r-- 1 wxnacy staff 100 Mar 25 22:53 b.py -rw-r--r-- 1 wxnacy staff 121 Mar 14 10:19 test.go -rw-r--r-- 1 wxnacy staff 106 Mar 13 10:53 test.js
这样得到的结果并准确,我们应该精确的对第 8 行进行正则匹配
$ awk '$8 ~ /10/ {print $0}' text -rw-r--r-- 1 wxnacy staff 121 Mar 14 10:19 test.go -rw-r--r-- 1 wxnacy staff 106 Mar 13 10:53 test.js
现在问题来了,我希望对 10
进行参数化,该怎么做呢?
awk 命令行模式可以直接使用 shell 参数,不过比较麻烦一点
$ hour=10 $ echo $hour 10 $ awk '$8 ~ /'"$hour"'/ {print $0}' text
$hour
还需要使用 '""'
包裹起来才行
好在 awk 也有办法传递参数,使用 -v
即可
$ awk -v hour=10 '$8 ~ hour {print $0}' text
如果使用参数的话,正则内容就不用 //
包裹了,直接使用参数即可。
只是这种情况下,如果我们想增加额外的符号,需要使用字符串包裹起来,比如想要查找时间以 18
为结尾的文件
$ awk -v hour=18 '$8 ~ hour"$" {print $0}' text -rw-r--r-- 1 wxnacy staff 861 Apr 17 18:18 test
也可以使用 if
条件语句
$ awk -v hour=18 '{ if ($8 ~ hour"$") {print $0} }' text
很明显,命令行中使用 if
条件语句显得很乱,这主要还是要引出脚本化来。
脚本中传参
我们先将单引号中的条件脚本化
$ touch split.awk $ chmod +x split.awk $ vim split.awk
#!/usr/bin/env awk -f { if ($8 ~ hour"$"){ print $0 } }
执行
$ ./split.awk -v hour=18 text -rw-r--r-- 1 wxnacy staff 861 Apr 17 18:18 test
这只是一个很简单的例子,真实的开发中,判断条件往往更加复杂的多,所以使用脚本是很明智的办法。
最后提一句,使用 match()
可以使脚本的可读性更好一些。
#!/usr/bin/env awk -f { if (match($8 , hour"$")){ print $0 } }
最近更新
Redis get 报错 a key holding the wrong kind of value
Python 获取当前作用域全部参数的内置方法 locals()
最近热读
Go 语法错误:Non-declaration statement outside function body
Python f-strings 3.6 版本新增加的字符串格式化功能
扫码关注公众号,或搜索公众号“温欣爸比” 及时获取我的最新文章
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。