【问题标题】:search for a string with special characters linux搜索带有特殊字符的字符串 linux
【发布时间】:2018-05-01 14:05:03
【问题描述】:

我是 bash 脚本的新手。我正在尝试从文件中获取与某些模式匹配的单词。但是,我无法从中得到任何东西。我认为问题出在特殊字符上。有人可以帮我找到解决方案。

示例:

我的代码:

awk '/[c8d313c81caa1103:-603ec52f:1630466b4e8:5448][amirbekova] com.sas.analytics.crm.custdata.sql/{flag=1;next}/quit;/{flag=0}flag && /CMDM\./' SASMarketingAutomationCore5.4.log.2018-04-27 >> test1.txt

所以我正在寻找 CMDM。模式之间的单词:

[c8d313c81caa1103:-603ec52f:1630466b4e8:5448][amirbekova] com.sas.analytics.crm.custdata.sql

quit;

输入:

[c8d313c81caa1103:-603ec52f:1630466b4e8:5448][amirbekova] com.sas.analytics.crm.custdata.sql - TID[25810F8F] \namirbekova----- Execute Sql in MAIQService.execute() ----- \nPROC SQL; \nCreate table MATables.TXIDFAEAIZ5BDSAAGamirbekova as \nSELECT DISTINCT table0.DWH_ID AS DWH_ID LABEL='Идентификатор клиента в КИХ' FORMAT=$40. \nFROM \nCMDM.INDIVIDUAL_OBLIGATIONS table2 Left join CMDM.SYS_DICT_BINARY table1 on ( ( (table2.IO_ACTIVE_SIGN=table1.ID)) ) \nRight join CMDM.CLIENT table0 on ( ( (table0.DWH_ID=table2.CLIENT _DWH_ID)) ) quit;

输出:

- TID[25810F8F] amirbekova----- Execute Sql in MAIQService.execute() ----- PROC SQL; Create table MATables.TXIDFAEAIZ5BDSAAGamirbekova as SELECT DISTINCT table0.DWH_ID AS DWH_ID LABEL='Идентификатор клиента в КИХ' FORMAT=$40. FROM CMDM.INDIVIDUAL_OBLIGATIONS table2 Left join CMDM.SYS_DICT_BINARY table1 on ( ( (table2.IO_ACTIVE_SIGN=table1.ID)) ) Right join CMDM.CLIENT table0 on ( ( (table0.DWH_ID=table2.CLIENT _DWH_ID)) )

【问题讨论】:

  • 您可以添加输入文件的某些部分吗?输入和预期输出!
  • 这里是:[c8d313c81caa1103:-603ec52f:1630466b4e8:5448][amirbekova] com.sas.analytics.crm.custdata.sql - TID[25810F8F] amirbekova----- 执行 Sql in MAIQService.execute() ----- PROC SQL;创建表 MATables.TXIDFAEAIZ5BDSAAGamirbekova 作为 SELECT DISTINCT table0.DWH_ID AS DWH_ID LABEL='Идентификатор клиента в КИХ' FORMAT=$40。 FROM CMDM.INDIVIDUAL_OBLIGATIONS table2 左连接 CMDM.SYS_DICT_BINARY table1 on ( ( (table2.IO_ACTIVE_SIGN=table1.ID)) ) 右连接 CMDM.CLIENT table0 on ( ( (table0.DWH_ID=table2.CLIENT _DWH_ID)) ) 退出;跨度>
  • 预期输出是包含单词 CMDM 或这两种模式之间的所有内容的行
  • @Oljas 将您的示例输入/输出编辑到您的问题中,不要将其隐藏在 cmets 中。您不能在此处使用(大多数)格式,因此难以阅读。
  • 对不起,我明白了。现在可以了吗?我有多行包含此模式

标签: regex awk


【解决方案1】:

您可以在您的文件/变量上运行以下 grep 命令。

grep -oP '(?<=\[c8d313c81caa1103:-603ec52f:1630466b4e8:5448]\[amirbekova] com\.sas\.analytics\.crm\.custdata\.sql)(.*)(?=quit;)' ~/test_awk/input_file

说明:

  • -oP -o 仅显示匹配的正则表达式而不是整行,-P 激活 perl 正则表达式以进行后视/前瞻,...

  • 以下正则表达式 (?&lt;=\[c8d313c81caa1103:-603ec52f:1630466b4e8:5448]\[amirbekova] com\.sas\.analytics\.crm\.custdata\.sql)(.*)(?=quit;) 以匹配您的模式:演示:https://regex101.com/r/FFrCu3/1/ 和 关于正则表达式的解释:http://www.rexegg.com/regex-quickstart.html

演示:

$ cat ~/test_awk/input_file
[c8d313c81caa1103:-603ec52f:1630466b4e8:5448][amirbekova] com.sas.analytics.crm.custdata.sql - TID[25810F8F] amirbekova----- Execute Sql in MAIQService.execute() ----- PROC SQL; Create table MATables.TXIDFAEAIZ5BDSAAGamirbekova as SELECT DISTINCT table0.DWH_ID AS DWH_ID LABEL='Идентификатор клиента в КИХ' FORMAT=$40. FROM CMDM.INDIVIDUAL_OBLIGATIONS table2 Left join CMDM.SYS_DICT_BINARY table1 on ( ( (table2.IO_ACTIVE_SIGN=table1.ID)) ) Right join CMDM.CLIENT table0 on ( ( (table0.DWH_ID=table2.CLIENT _DWH_ID)) ) quit;

$ grep -oP '(?<=\[c8d313c81caa1103:-603ec52f:1630466b4e8:5448]\[amirbekova] com\.sas\.analytics\.crm\.custdata\.sql)(.*)(?=quit;)' ~/test_awk/input_file
 - TID[25810F8F] amirbekova----- Execute Sql in MAIQService.execute() ----- PROC SQL; Create table MATables.TXIDFAEAIZ5BDSAAGamirbekova as SELECT DISTINCT table0.DWH_ID AS DWH_ID LABEL='Идентификатор клиента в КИХ' FORMAT=$40. FROM CMDM.INDIVIDUAL_OBLIGATIONS table2 Left join CMDM.SYS_DICT_BINARY table1 on ( ( (table2.IO_ACTIVE_SIGN=table1.ID)) ) Right join CMDM.CLIENT table0 on ( ( (table0.DWH_ID=table2.CLIENT _DWH_ID)) ) 

如果您的模式在多行上,那么您可以使用以下awk 命令:

awk '/^\[c8d313c81caa1103:-603ec52f:1630466b4e8:5448\]\[amirbekova\] com.sas.analytics.crm.custdata.sql/{flag=1;print $NF;next}/^quit;/{flag=0;}{if(flag){print}}' input_file

【讨论】:

  • 艾伦,如果
    [c8d313c81caa1103:-603ec52f:1630466b4e8:5448] [amirbekova] 之间有空格,此代码是否有效?
  • @Oljas:如果您的模式在多行上,它将无法正常工作......让我来解决这个问题
  • 艾伦,我的意思是我的两个方括号之间有一个空格。那是代码不起作用的情况吗?
  • @Oljas:您可以将 awk 命令更改为:awk '/^\[c8d313c81caa1103:-603ec52f:1630466b4e8:5448\]\s+\[amirbekova\] com.sas.analytics.crm.custdata.sql/{flag=1;print $NF;next}/^quit;/{flag=0;}{if(flag){print}}' input_file 以考虑空格
  • 写你的评论,你应该提到\s 只是 GNU awk。
【解决方案2】:

[] 在正则表达式中很特殊,需要转义:\[

第一个模式中的点也是如此:com\.sas\. 等。

【讨论】:

  • @Oljas "没有工作" 不是问题描述。见minimal reproducible example
  • 正确吗? awk '/\[c8d313c81caa1103:-603ec52f:1630466b4e8:5448\]\[amirbekova\] com\.sas\.analytics\.crm\.custdata.sql/{flag=1;next}/quit;/{flag= 0}flag && /CMDM\./' SASMarketingAutomationCore5.4.log.2018-04-27 >> test1.txt
  • @Oljas 您的评论不断变化。请将代码作为代码发布,以便我可以看到您实际在做什么。
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多