根据 shell 脚本中的模式提取字符串

Extract string based on pattern in shell script

我正在编写脚本,但卡在了必须根据模式提取字符串的位置。 我试过使用 awk 和 cut 但无法获得正确的结果。

我的文件中有 3 行,我希望提取倒数第​​二列

预期输出

  1. MxMonitor_Marvel_PI49
  2. alert_manager
  3. MxMonitor_Marvel_PI49

我尝试了下面的,这是我得到的最接近的,但它只提取了几行,而不是全部。

awk  -F"," '{print }' Filename.txt

文件内容

./subsearch_nested_fa89eeb0810630b9_1626351940.6/metadata.csv:2:"read : [ admin ], write : [ admin ]",admin,"MxMonitor_Marvel_PI49",300
./scheduler__nobody_YWxlcnRfbWFuYWdlcg__RMD5922da96313b0bb40_at_1626282000_20762/metadata.csv:2:"read : [ splunk-system-user ], write : [ splunk-system-user ]","splunk-system-user","alert_manager",86400
./subsearch_admin__admin_TXhNb25pdG9yX01hcnZlbF9QSTQ5__search12_1626351937.20757776_1626351938.1/metadata.csv:2:"read : [ admin ], write : [ admin ]",admin,"MxMonitor_Marvel_PI49",300

使用您显示的示例,请尝试以下代码。将字段分隔符设置为 , 并从倒数第二个字段中删除开始、结束 ",最后打印它。

awk -F, '{gsub(/^"|"$/,"",$(NF-1));print $(NF-1)}' Input_file

你可以试试这个更短的 awk:

awk '{gsub(/^.*,"|",.*/, "")} 1' file

MxMonitor_Marvel_PI49
alert_manager
MxMonitor_Marvel_PI49

太相似了sed:

sed -E 's/^.*,"|",.*//g' file
$ awk -F'"' '{print $(NF-1)}' file
MxMonitor_Marvel_PI49
alert_manager
MxMonitor_Marvel_PI49

如果字段分隔符是逗号并且值可以选择用双引号引起来,对于示例数据,您可以使用 "?,"?[=13= 将字段分隔符设置为可选双引号之间的逗号]

awk -F '"?,"?' '{print $(NF-1)}' file

输出

MxMonitor_Marvel_PI49
alert_manager
MxMonitor_Marvel_PI49