免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3170 | 回复: 3
打印 上一主题 下一主题

[文本处理] awk中同时定义包含"\"的多个分割符的问题 [复制链接]

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-04 17:37 |只看该作者 |倒序浏览

各位好,问个awk分隔符的问题

对于文本:
InputFile                     : .\anchors-raw\BasketballPass_408x232.xxx
我要取出来BasketballPass_408x232时,
使用awk如何同时定义"."和"\"为分隔符,各种尝试后,发现"\"是不能和别的字符同时作为分隔符一起定义的,
毕竟是自己和几个网友测试的,暂时也没有找到官方的文档,所以不太确定,请大神们鉴定下,多谢!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2014-07-04 17:39 |只看该作者
回复 1# jeffreyst
  1. awk -F'[.\\\\]' '{print $(NF-1)}'
复制代码

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
3 [报告]
发表于 2014-07-04 17:41 |只看该作者
本帖最后由 jeffreyst 于 2014-07-04 17:42 编辑

回复 2# yinyuemi


    多谢多谢,
    没文化,真可怕呀~

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
4 [报告]
发表于 2014-07-04 17:53 |只看该作者
网上找到一个解释,索性贴出来吧

http://blog.csdn.net/mydreamongo/article/details/9960491

今天看到个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 `.'

查了下,应该是多次转义的问题,有个讲解是说的比较清楚的,转载如下:



对于 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP