根据 shell 脚本中的模式提取字符串
Extract string based on pattern in shell script
我正在编写脚本,但卡在了必须根据模式提取字符串的位置。
我试过使用 awk 和 cut 但无法获得正确的结果。
我的文件中有 3 行,我希望提取倒数第二列
预期输出
- MxMonitor_Marvel_PI49
- alert_manager
- 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
我正在编写脚本,但卡在了必须根据模式提取字符串的位置。 我试过使用 awk 和 cut 但无法获得正确的结果。
我的文件中有 3 行,我希望提取倒数第二列
预期输出
- MxMonitor_Marvel_PI49
- alert_manager
- 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