awk 使用正则表达式过滤文本时可以使用可变参数,我本认为这应该是很普遍的需求,然而网上找了一圈也没看到一个比较全面的教程,不过东拼西凑也总算是满足了需求,今天来总结下。
首先将当前文件列表导入到一份文本文件 text 中,作为测试使用
1 | $ ll > text |
命令行传参
首先我们打算过滤文件列表的最后修改时间为 10
点的数据
1 | $ awk '/10/ {print $0}' text |
这样得到的结果并准确,我们应该精确的对第 8 行进行正则匹配
1 | $ awk '$8 ~ /10/ {print $0}' text |
现在问题来了,我希望对 10
进行参数化,该怎么做呢?
awk 命令行模式可以直接使用 shell 参数,不过比较麻烦一点
1 | $ hour=10 |
$hour
还需要使用 '""'
包裹起来才行
好在 awk 也有办法传递参数,使用 -v
即可
1 | $ awk -v hour=10 '$8 ~ hour {print $0}' text |
如果使用参数的话,正则内容就不用 //
包裹了,直接使用参数即可。
只是这种情况下,如果我们想增加额外的符号,需要使用字符串包裹起来,比如想要查找时间以 18
为结尾的文件
1 | $ awk -v hour=18 '$8 ~ hour"$" {print $0}' text |
也可以使用 if
条件语句
1 | $ awk -v hour=18 '{ if ($8 ~ hour"$") {print $0} }' text |
很明显,命令行中使用 if
条件语句显得很乱,这主要还是要引出脚本化来。
脚本中传参
我们先将单引号中的条件脚本化
1 | $ touch split.awk |
1 | #!/usr/bin/env awk -f |
执行
1 | $ ./split.awk -v hour=18 text |
这只是一个很简单的例子,真实的开发中,判断条件往往更加复杂的多,所以使用脚本是很明智的办法。
最后提一句,使用 match()
可以使脚本的可读性更好一些。
1 | #!/usr/bin/env awk -f |
最近热读
扫码关注公众号,或搜索公众号“温欣爸比”
及时获取我的最新文章
