shell awk正则式匹配问题
来源:互联网 发布:java 发邮件代码 编辑:程序博客网 时间:2024/05/29 16:31
今天看到个shell脚本里面awk处理字符串的,里面有一句gsub("\\.[0-9]+$","",$2),而这个$2的格式是2013-08-07 00:12:13.333这种,这个gsub想要把.333给去掉,看着不太正常,感觉里面的正则式应该是匹配不到.333的啊。\\转义后就变成了一个\,而原来的.是没有被转义的,这样就应该无法截取掉.333的,可实际运行了一下,的确可以正确运行,然后又去掉一个\试了下,也可以,但是提示awk: warning: escape sequence `\.' treated as plain `.'
查了下,应该是多次转义的问题,有个讲解是说的比较清楚的,转载如下:
原始地址:http://pzy84.blogbus.com/logs/80017403.html
对于 AWK 程序中的pattern,用"//"包围即可,比如
mount |awk '/type (ext3|tmpfs)/ {print $1}'
分隔符(field separator)也支持正则表达式,它在 awk 程序中是一个名为 FS 的变量,可以在命令行中通过 -F 参数设置 FS 变量的值,比如
awk -F '[:/]' '{print $2}'
如果方括号本身就是分隔符,比如想提取日志中用[]包围的时间戳,就需要非常小心地使用引号和转义,因为shell会抢先转义。
通过试验,我发现这里面有三层转义,按执行顺序依次是:
shell
awk
field separator processor
要禁止shell转义,请用单引号包围 FS 的值,否则使用双引号或干脆不用引号(仅当参数不包含空格时)。
awk的转义是无法禁止的,所以只能通过累加转义来抵消它的影响,也就是用 '\\' 表达 '\'。
field separator processor 是我想象出来的一个东西,总之我们的目的就是让 FS 的值正好就是最根本的那个正则表达式。
以下是一些示例,正反面都有。示例程序的任务是从"[234 abc] lalala"中提取出"234 abc"。
(1) 失败,"[\[\]]" 被 awk 转义成 "[[]]" 了
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F '[\[\]]' '{print $2}'
awk: warning: escape sequence `\[' treated as plain `['
awk: warning: escape sequence `\]' treated as plain `]'
(2) 成功,"[\\[\\]]" 被 awk 转义成 "[\[\]]" 了,而这正是我们想要的结果
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F '[\\[\\]]' '{print $2}'
234 abc
(3) 失败,"[\\[\\]]" 先被 shell 转移成 "[\[\]]",再被 awk 转义成 "[[]]" 了
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F "[\\[\\]]" '{print $2}'
awk: warning: escape sequence `\[' treated as plain `['
awk: warning: escape sequence `\]' treated as plain `]'
(4) 成功,"[\\\\[\\\\]]" 先被 shell 转义成 "[\\[\\]]",再被 awk 转义成 "[\[\]]"
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F "[\\\\[\\\\]]" '{print $2}'
234 abc
(5) 成功,跟(4)的原理相同
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F [\\\\[\\\\]] '{print $2}'
234 abc
(6) 成功,原理我就不明白了,在论坛里看到的,由它还可以衍生出很多变种
[pzy@vm ~]$ echo "[234 abc] lalala" | awk -F [][] '{print $2}'
234 abc
- shell awk正则式匹配问题
- awk正则匹配
- awk 不支持的正则匹配
- shell case正则匹配
- shell正则匹配日期
- Linux shell中的一个问题 ${}带正则匹配的表达式
- shell脚本里面通过正则匹配操作字符串的问题
- awk中的匹配区间问题
- awk中正则只能贪婪匹配
- awk使用shell变量问题
- shell中的正则表达式、sed、awk
- 学习shell, 正则表达式, awk, sed
- Shell编程---grep和awk&正则表达式
- Linux Shell脚本(正则/Sed/AWK)
- 正则表达式匹配问题
- 正则^$匹配范围问题
- 正则表达式匹配问题
- 正则 匹配数字问题
- 如何配置shopex网店静态化(URL重写)
- 内存_页的初始化
- 压力测试准备工作
- Unity3D多开方法
- kali linux 国内更新源
- shell awk正则式匹配问题
- 图片高亮的解决办法
- 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
- 《广语言JavaScript中文编程》关键字与内置对象函数化
- java连接sql2005多实例动态端口问题
- 闲话成本管理
- STL函数对象
- 开通BLOG
- Linux buffer和cache区别