awk 正则表达式中使用参数

栏目: 服务器 · 发布时间: 7年前

内容简介:awk 使用正则表达式过滤文本时可以使用可变参数,我本认为这应该是很普遍的需求,然而网上找了一圈也没看到一个比较全面的教程,不过东拼西凑也总算是满足了需求,今天来总结下。首先将当前文件列表导入到一份文本文件

awk 使用正则表达式过滤文本时可以使用可变参数,我本认为这应该是很普遍的需求,然而网上找了一圈也没看到一个比较全面的教程,不过东拼西凑也总算是满足了需求,今天来总结下。

首先将当前文件列表导入到一份文本文件 text 中,作为测试使用

$ ll > text

awk 正则表达式中使用参数

命令行传参

首先我们打算过滤文件列表的最后修改时间为 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
    }
}

最近更新

Python 如何给屏幕打印信息加上颜色

Redis get 报错 a key holding the wrong kind of value

Vim 执行 Shell 命令(2)

Python 获取当前作用域全部参数的内置方法 locals()

使用 ffmpeg 分离视频流和音频流

Vim 执行 Shell 命令(1)

使用 goss 构建 Github 图床

Linux tar 打包命令

Python 如何打印不换行进度条

Python 操作 ini 配置文件

最近热读

Go 判断数组中是否包含某个 item

办理北京工作居住证的一些细节

Go 语法错误:Non-declaration statement outside function body

Python f-strings 3.6 版本新增加的字符串格式化功能

Python APScheduler 定时任务

扫码关注公众号,或搜索公众号“温欣爸比” 及时获取我的最新文章 awk 正则表达式中使用参数


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法引论

算法引论

[美]乌迪·曼博(Udi Manber) / 黄林鹏、谢瑾奎、陆首博、等 / 电子工业出版社 / 2010-1 / 36.00元

本书是国际算法大师乌迪·曼博(Udi Manber)博士撰写的一本享有盛誉的著作。全书共分12章:第1章到第4章为介绍性内容,涉及数学归纳法、算法分析、数据结构等内容;第5章提出了与归纳证明进行类比的算法设计思想;第6章到第9章分别给出了4个领域的算法,如序列和集合的算法、图算法、几何算法、代数和数值算法;第10章涉及归约,也是第11章的序幕,而后者涉及NP完全问题;第12章则介绍了并行算法;最后......一起来看看 《算法引论》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器