从 shell 中的一行获取不同字符串的命令
Command to get different strings from a line in shell
我有一个文本文件。文件中的一些示例行如下
MESS01: Java flow 'com.java.abc.SupportToolsOutput' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.ErrorNotify' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.Output' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.LogRequest' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.Router' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.ProcessMessageNextGen' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.RouteMessage' on jvm group 'JVM123' is stopped.`
我正在尝试使用单个 shell 命令获取输出
com.java.abc.SupportToolsOutput,running
com.java.abc.ErrorNotify,running
com.java.abc.Output,running
com.java.abc.LogRequest,running
com.java.abc.Router,running
com.java.abc.ProcessMessageNextGen,running
com.java.abc.RouteMessage,stopped`
我尝试使用 substr 和 awk。
我尝试了 cat textfile.txtt|awk '{print substr(,2,length()-1)}'|sed "s/'/ /g"
和 cat textfile.txt|awk '{ print , }'|sed "s/'/ /g"
但无法获得所需的结果。
请帮忙。
更新:如果我的文本文件是这样的
MESS01: Java flow 'com.java.abc.SupportToolsOutput' on jvm group 'JVM123' is running.
Additional thread instances: '0'
Deployed: '1/11/12 2:44 AM' in Bar file '/www/deploy/JVM123/SupportToolsOutputDEV_2012-01-11_02-44-27.bar'
Last edited: '1/10/12 5:02 PM'
UUID: 'f9a9f0cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'BackOutThreshold' = '1'
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
'NotificationInterval' = '300'
Keywords:
--------
MESS01: Java flow 'com.java.abc.ErrorNotify' on jvm group 'JVM123' is running.
Additional thread instances: '0'
Deployed: '1/11/12 2:45 AM' in Bar file '/www/deploy/JVM123/ErrorNotifyDEV_2012-01-11_02-45-45.bar'
Last edited: '1/10/12 5:04 PM'
UUID: 'efcff1cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
Keywords:
--------
MESS01: Java flow 'com.java.abc.Output' on jvm group 'JVM123' is running.
Additional thread instances: '0'
Deployed: '1/11/12 2:46 AM' in Bar file '/www/deploy/JVM123/OutputDEV_2012-01-11_02-46-44.bar'
Last edited: '1/10/12 3:30 PM'
UUID: '1fbbf2cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'BackOutThreshold' = '1'
'BasicAuthorization' = 'YWRtaW46cGFzc3dvcmQ='
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
'NotificationInterval' = '300'
'ProxyAuthorization' = 'QTkwNzk2MzpnNzVuajZqcQ=='
'isSslSecured' = 'FALSE'
Keywords:
--------
MESS01: Java flow 'com.java.abc.LogRequest' on jvm group 'JVM123' is running.
Additional thread instances: '4'
Deployed: '1/11/12 2:48 AM' in Bar file '/www/deploy/JVM123/LogRequestDEV_2012-01-11_02-48-54.bar'
Last edited: '1/10/12 4:00 PM'
UUID: '60b4f4cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'EVENTTYPE' = 'Integration_RequestSent'
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
'NotificationInterval' = '300'
'SOARTMCompliant' = 'FALSE'
Keywords:
--------
MESS01: Java flow 'com.java.abc.Router' on jvm group 'JVM123' is stopped.
Additional thread instances: '4'
Deployed: '1/11/12 2:49 AM' in Bar file '/www/deploy/JVM123/RouterDEV_2012-01-11_02-49-32.bar'
Last edited: '1/10/12 4:10 PM'
UUID: '8d46f5cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'BackOutThreshold' = '1'
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
'NotificationInterval' = '300'
Keywords:
--------
MESS02 : Java file 'Integration.jar' on on jvm group 'JVM123'.
Deployed: '1/11/12 2:46 AM' in Bar file '/www/deploy/JVM123/OutputDEV_2012-01-11_02-46-44.bar'
Last edited: '1/10/12 4:10 PM'
Keywords:
--------
MESS02 : Java file 'SAPAdapter.adapter' on on jvm group 'JVM123'.
Deployed: '1/11/12 2:46 AM' in Bar file '/www/deploy/JVM123/OutputDEV_2011-11-10_22-55-55.bar'
Last edited: '1/10/14 14:55 PM'
Keywords:
我希望输出为
JVM123,/www/deploy/JVM123/OutputDEV_2012-01-11_02-46-44.bar,Integration.jar
JVM123,/www/deploy/JVM123/OutputDEV_2011-11-10_22-55-55.bar,SAPAdapter.adapter
JVM123,/www/deploy/JVM123/SupportToolsOutputDEV_2012-01-11_02-44-27.bar,com.java.abc.SupportToolsOutput,running
JVM123,/www/deploy/JVM123/ErrorNotifyDEV_2012-01-11_02-45-45.bar,com.java.abc.ErrorNotify,running
JVM123,/www/deploy/JVM123/OutputDEV_2012-01-11_02-46-44.bar,com.java.abc.Output,running
JVM123,/www/deploy/JVM123/LogRequestDEV_2012-01-11_02-48-54.bar,com.java.abc.LogRequest,running
JVM123,/www/deploy/JVM123/RouterDEV_2012-01-11_02-49-32.bar,com.java.abc.Router,stopped
使用 awk 你可以做到:
awk -F "[' ]+" '{print "," $NF}' textfile.txtt
com.java.abc.SupportToolsOutput,running.
com.java.abc.ErrorNotify,running.
com.java.abc.Output,running.
com.java.abc.LogRequest,running.
com.java.abc.Router,running.
com.java.abc.ProcessMessageNextGen,running.
com.java.abc.RouteMessage,stopped.`
要从最后一个字段中删除一个 DOT
,请使用:
awk -F "[' ]+" '{sub(/\./, "", $NF); print "," $NF}' textfile.txtt
你的意思是:
cat test.txt|awk -F\ '{ print "," }' | sed "s/\'//g"|sed "s/\.$//"
给予
com.java.abc.SupportToolsOutput running
com.java.abc.ErrorNotify running
com.java.abc.Output running
com.java.abc.LogRequest running
com.java.abc.Router running
com.java.abc.ProcessMessageNextGen running
com.java.abc.RouteMessage stopped
还有一个awk
$ awk -v q="'" '{gsub(q,""); print "," $NF}' log
com.java.abc.SupportToolsOutput,running.
com.java.abc.ErrorNotify,running.
com.java.abc.Output,running.
com.java.abc.LogRequest,running.
com.java.abc.Router,running.
com.java.abc.ProcessMessageNextGen,running.
com.java.abc.RouteMessage,stopped.
如果重要,请删除最后一个句点
$ awk -v q="'" '{gsub(q,""); sub(/\.$/,""); print ","$NF}' log
com.java.abc.SupportToolsOutput,running
com.java.abc.ErrorNotify,running
com.java.abc.Output,running
com.java.abc.LogRequest,running
com.java.abc.Router,running
com.java.abc.ProcessMessageNextGen,running
com.java.abc.RouteMessage,stopped
这个在看到 MESS01 时抓取状态并在 Deployed 上打印。它使用简单直接的正则表达式作为字段分隔符:
LC_ALL=C awk -F "[ ']" -v OFS=, '/^MESS01:/ { sub(/\.$/,""); o=; j=; s=$NF; } /^Deployed:/ { print j, $(NF-1), o, s }' textfile.txt
测试过...它会生成您想要的结果。备注:
- 没有 cat 在此脚本的处理中受到伤害。 ;)
- 您的日志看起来全是 ASCII,使用 LC_ALL=C 可能会使脚本速度显着加快。
- 使用 NF 有助于避免任何日期问题并且很直观(在回答中,我告诉 reader 我在代码中的意图是在一个案例和下一个案例中查看最后一个字段到另一个字段的最后一个字段)。
- MESS01中sub()的原因是加了一个“.”在定界符正则表达式中会杀死你的对象。
- 将来,您可能会发现只使用 space 作为分隔符并使用 gsub() 过滤掉 jvm、对象和路径中的 ^'|'$ 会更好——在这种情况下您会想将过滤正则表达式作为变量传递(由于引用混淆)。
这是一个使用最后一点提到的 gsub() 的版本:
LC_ALL=C awk -v OFS=, -v r="^'|'$" '/^MESS01:/ { o=; j=; s=$NF; gsub(r,"",o); gsub(r,"",j); sub(/\.$/,"",s) } /^Deployed:/ { p=$NF; gsub(r,"",p); print j, p, o, s }' textfile.txt
对于透视,这是一个 sed 解决方案。
如果您只是按照您的示例解析文本,则以下内容可能就足够了:
sed "s/[^']*'//;s/'.* /,/" logfile
这里的两个 sed 命令 (1) 删除第一个单引号之前的所有内容,(2) 替换行中从下一个单引号到最后一个 space 的所有内容。向其中添加 ;s/.$//
以去除尾随句点。
如果您要解析在更新中添加的较大日志,则需要稍微调整一下。以下将使用扩展日志生成您最初请求的输出:
sed -n "/^MESS01:/{;s/[^']*'//;s/'.* /,/;p;}" logfile
这与之前的脚本相同,但仅在以 MESS01:
开头的行上......并且它也仅打印与该模式匹配的行。
对于您在问题底部提到的输出,我不建议您使用 sed,因为您需要从本质上具有 multi-line 记录的日志中的不同字段中提取数据。使用 sed 可能可行,但它会非常复杂。 Awk 在这方面要好得多。
我有一个文本文件。文件中的一些示例行如下
MESS01: Java flow 'com.java.abc.SupportToolsOutput' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.ErrorNotify' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.Output' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.LogRequest' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.Router' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.ProcessMessageNextGen' on jvm group 'JVM123' is running.
MESS01: Java flow 'com.java.abc.RouteMessage' on jvm group 'JVM123' is stopped.`
我正在尝试使用单个 shell 命令获取输出
com.java.abc.SupportToolsOutput,running
com.java.abc.ErrorNotify,running
com.java.abc.Output,running
com.java.abc.LogRequest,running
com.java.abc.Router,running
com.java.abc.ProcessMessageNextGen,running
com.java.abc.RouteMessage,stopped`
我尝试使用 substr 和 awk。
我尝试了 cat textfile.txtt|awk '{print substr(,2,length()-1)}'|sed "s/'/ /g"
和 cat textfile.txt|awk '{ print , }'|sed "s/'/ /g"
但无法获得所需的结果。
请帮忙。
更新:如果我的文本文件是这样的
MESS01: Java flow 'com.java.abc.SupportToolsOutput' on jvm group 'JVM123' is running.
Additional thread instances: '0'
Deployed: '1/11/12 2:44 AM' in Bar file '/www/deploy/JVM123/SupportToolsOutputDEV_2012-01-11_02-44-27.bar'
Last edited: '1/10/12 5:02 PM'
UUID: 'f9a9f0cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'BackOutThreshold' = '1'
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
'NotificationInterval' = '300'
Keywords:
--------
MESS01: Java flow 'com.java.abc.ErrorNotify' on jvm group 'JVM123' is running.
Additional thread instances: '0'
Deployed: '1/11/12 2:45 AM' in Bar file '/www/deploy/JVM123/ErrorNotifyDEV_2012-01-11_02-45-45.bar'
Last edited: '1/10/12 5:04 PM'
UUID: 'efcff1cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
Keywords:
--------
MESS01: Java flow 'com.java.abc.Output' on jvm group 'JVM123' is running.
Additional thread instances: '0'
Deployed: '1/11/12 2:46 AM' in Bar file '/www/deploy/JVM123/OutputDEV_2012-01-11_02-46-44.bar'
Last edited: '1/10/12 3:30 PM'
UUID: '1fbbf2cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'BackOutThreshold' = '1'
'BasicAuthorization' = 'YWRtaW46cGFzc3dvcmQ='
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
'NotificationInterval' = '300'
'ProxyAuthorization' = 'QTkwNzk2MzpnNzVuajZqcQ=='
'isSslSecured' = 'FALSE'
Keywords:
--------
MESS01: Java flow 'com.java.abc.LogRequest' on jvm group 'JVM123' is running.
Additional thread instances: '4'
Deployed: '1/11/12 2:48 AM' in Bar file '/www/deploy/JVM123/LogRequestDEV_2012-01-11_02-48-54.bar'
Last edited: '1/10/12 4:00 PM'
UUID: '60b4f4cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'EVENTTYPE' = 'Integration_RequestSent'
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
'NotificationInterval' = '300'
'SOARTMCompliant' = 'FALSE'
Keywords:
--------
MESS01: Java flow 'com.java.abc.Router' on jvm group 'JVM123' is stopped.
Additional thread instances: '4'
Deployed: '1/11/12 2:49 AM' in Bar file '/www/deploy/JVM123/RouterDEV_2012-01-11_02-49-32.bar'
Last edited: '1/10/12 4:10 PM'
UUID: '8d46f5cb-3401-0000-0080-b85eb6410185'
Start mode: 'Maintained'
Long description: ''
User-defined property names:
'BackOutThreshold' = '1'
'LogLevel' = 'ERROR'
'MaxPerInterval' = '5'
'NotificationInterval' = '300'
Keywords:
--------
MESS02 : Java file 'Integration.jar' on on jvm group 'JVM123'.
Deployed: '1/11/12 2:46 AM' in Bar file '/www/deploy/JVM123/OutputDEV_2012-01-11_02-46-44.bar'
Last edited: '1/10/12 4:10 PM'
Keywords:
--------
MESS02 : Java file 'SAPAdapter.adapter' on on jvm group 'JVM123'.
Deployed: '1/11/12 2:46 AM' in Bar file '/www/deploy/JVM123/OutputDEV_2011-11-10_22-55-55.bar'
Last edited: '1/10/14 14:55 PM'
Keywords:
我希望输出为
JVM123,/www/deploy/JVM123/OutputDEV_2012-01-11_02-46-44.bar,Integration.jar
JVM123,/www/deploy/JVM123/OutputDEV_2011-11-10_22-55-55.bar,SAPAdapter.adapter
JVM123,/www/deploy/JVM123/SupportToolsOutputDEV_2012-01-11_02-44-27.bar,com.java.abc.SupportToolsOutput,running
JVM123,/www/deploy/JVM123/ErrorNotifyDEV_2012-01-11_02-45-45.bar,com.java.abc.ErrorNotify,running
JVM123,/www/deploy/JVM123/OutputDEV_2012-01-11_02-46-44.bar,com.java.abc.Output,running
JVM123,/www/deploy/JVM123/LogRequestDEV_2012-01-11_02-48-54.bar,com.java.abc.LogRequest,running
JVM123,/www/deploy/JVM123/RouterDEV_2012-01-11_02-49-32.bar,com.java.abc.Router,stopped
使用 awk 你可以做到:
awk -F "[' ]+" '{print "," $NF}' textfile.txtt
com.java.abc.SupportToolsOutput,running.
com.java.abc.ErrorNotify,running.
com.java.abc.Output,running.
com.java.abc.LogRequest,running.
com.java.abc.Router,running.
com.java.abc.ProcessMessageNextGen,running.
com.java.abc.RouteMessage,stopped.`
要从最后一个字段中删除一个 DOT
,请使用:
awk -F "[' ]+" '{sub(/\./, "", $NF); print "," $NF}' textfile.txtt
你的意思是:
cat test.txt|awk -F\ '{ print "," }' | sed "s/\'//g"|sed "s/\.$//"
给予
com.java.abc.SupportToolsOutput running
com.java.abc.ErrorNotify running
com.java.abc.Output running
com.java.abc.LogRequest running
com.java.abc.Router running
com.java.abc.ProcessMessageNextGen running
com.java.abc.RouteMessage stopped
还有一个awk
$ awk -v q="'" '{gsub(q,""); print "," $NF}' log
com.java.abc.SupportToolsOutput,running.
com.java.abc.ErrorNotify,running.
com.java.abc.Output,running.
com.java.abc.LogRequest,running.
com.java.abc.Router,running.
com.java.abc.ProcessMessageNextGen,running.
com.java.abc.RouteMessage,stopped.
如果重要,请删除最后一个句点
$ awk -v q="'" '{gsub(q,""); sub(/\.$/,""); print ","$NF}' log
com.java.abc.SupportToolsOutput,running
com.java.abc.ErrorNotify,running
com.java.abc.Output,running
com.java.abc.LogRequest,running
com.java.abc.Router,running
com.java.abc.ProcessMessageNextGen,running
com.java.abc.RouteMessage,stopped
这个在看到 MESS01 时抓取状态并在 Deployed 上打印。它使用简单直接的正则表达式作为字段分隔符:
LC_ALL=C awk -F "[ ']" -v OFS=, '/^MESS01:/ { sub(/\.$/,""); o=; j=; s=$NF; } /^Deployed:/ { print j, $(NF-1), o, s }' textfile.txt
测试过...它会生成您想要的结果。备注:
- 没有 cat 在此脚本的处理中受到伤害。 ;)
- 您的日志看起来全是 ASCII,使用 LC_ALL=C 可能会使脚本速度显着加快。
- 使用 NF 有助于避免任何日期问题并且很直观(在回答中,我告诉 reader 我在代码中的意图是在一个案例和下一个案例中查看最后一个字段到另一个字段的最后一个字段)。
- MESS01中sub()的原因是加了一个“.”在定界符正则表达式中会杀死你的对象。
- 将来,您可能会发现只使用 space 作为分隔符并使用 gsub() 过滤掉 jvm、对象和路径中的 ^'|'$ 会更好——在这种情况下您会想将过滤正则表达式作为变量传递(由于引用混淆)。
这是一个使用最后一点提到的 gsub() 的版本:
LC_ALL=C awk -v OFS=, -v r="^'|'$" '/^MESS01:/ { o=; j=; s=$NF; gsub(r,"",o); gsub(r,"",j); sub(/\.$/,"",s) } /^Deployed:/ { p=$NF; gsub(r,"",p); print j, p, o, s }' textfile.txt
对于透视,这是一个 sed 解决方案。
如果您只是按照您的示例解析文本,则以下内容可能就足够了:
sed "s/[^']*'//;s/'.* /,/" logfile
这里的两个 sed 命令 (1) 删除第一个单引号之前的所有内容,(2) 替换行中从下一个单引号到最后一个 space 的所有内容。向其中添加 ;s/.$//
以去除尾随句点。
如果您要解析在更新中添加的较大日志,则需要稍微调整一下。以下将使用扩展日志生成您最初请求的输出:
sed -n "/^MESS01:/{;s/[^']*'//;s/'.* /,/;p;}" logfile
这与之前的脚本相同,但仅在以 MESS01:
开头的行上......并且它也仅打印与该模式匹配的行。
对于您在问题底部提到的输出,我不建议您使用 sed,因为您需要从本质上具有 multi-line 记录的日志中的不同字段中提取数据。使用 sed 可能可行,但它会非常复杂。 Awk 在这方面要好得多。