Bash 从命令';s输出
我有一个需求,我必须从命令的输出中捕获一个字符串,并将其存储起来以供进一步处理。问题是命令的输出有时可能会改变,因此这会导致错误的结果Bash 从命令';s输出,bash,shell,awk,grep,Bash,Shell,Awk,Grep,我有一个需求,我必须从命令的输出中捕获一个字符串,并将其存储起来以供进一步处理。问题是命令的输出有时可能会改变,因此这会导致错误的结果 请求的数据集看起来像 application_1532934978357_3376 app_name job_type user any_name_2 RUNNING UNDEFINED 10% hostname application_1532934978357_3375 app_name job_type user any_name_2 RUNNING
请求的数据集看起来像
application_1532934978357_3376 app_name job_type user any_name_2 RUNNING
UNDEFINED 10% hostname
application_1532934978357_3375 app_name job_type user any_name_2 RUNNING
UNDEFINED 10% hostname
application_1532934978357_3374 app_name job_type user any_name_2 RUNNING
UNDEFINED 10% hostname
application_1532934978357_249069 some_information_etc job_type any_name_2
RUNNING UNDEFINED 95% hostname
application_1532934978357_239728 app_name job_type any_name_2 RUNNING
UNDEFINED 10% hostname
application_1532934978357_89483 some_info job_type user any_name RUNNING
UNDEFINED 10% hostname
application_1532934978357_248180 with prog_vrsn as
(se...select cast(Stage-27) job_type user any_name RUNNING UNDEFINED 36.1%
hostname
application_15329349783879_657880 select cast
value ..(stage35) with table
where value=5; job_type user any_name RUNNING UNDEFINED 10% hostname
我使用:
cat in | grep "RUNNING" | grep "any_name" | awk '{print $1}'
它生成的输出为
application_1532934978357_89483
(se...select cast(Stage-27)
where
而我希望将输出生成为:
application_1532934978357_89483
application_1532934978357_248180
application_15329349783879_657880
您只需在命令中再添加一个grep:
命令的输出| grep“status_run”| grep-e“id_tag1”-e“id_tag2”| grep“app_id”| awk'{print$1}'
或
awk'(/status\u run/)&&(/app\u id*/)&(/id\u tag[12]/){print$1;}文件名
这将只打印id为tag1和tag2且其中包含“status\u run”的所有应用程序id
更新问题后的解决方案:
cat filename | grep“运行”| grep“任意名称”| grep“应用程序*”| awk'{print$1}'
如果要打印所有应用程序ID,请使用以下命令:
awk'/application*/{print$1}文件名
您只需在命令中再添加一个grep:
命令的输出| grep“status_run”| grep-e“id_tag1”-e“id_tag2”| grep“app_id”| awk'{print$1}'
或
awk'(/status\u run/)&&(/app\u id*/)&(/id\u tag[12]/){print$1;}文件名
这将只打印id为tag1和tag2且其中包含“status\u run”的所有应用程序id
更新问题后的解决方案:
cat filename | grep“运行”| grep“任意名称”| grep“应用程序*”| awk'{print$1}'
如果要打印所有应用程序ID,请使用以下命令:
awk'/application*/{print$1}文件名
这是一个GNU awk脚本,它只捕获与单词任何名称
关联的应用程序XXXX
:
awk -v RS='[ \n]' '/application_[0-9_]+/{a=$0}/\<any_name\>/{print a}' file
awk-vrs='[\n]'/application\[0-9\]+/{a=$0}/\/{print a}文件
它依赖于设置为捕获每个单词的记录分隔符
RS
。application\u XXXX
字符串存储在变量a
中,并在找到单词any\u name
时打印。这里是一个GNU awk脚本,它只捕获与单词any\u name
关联的应用程序XXXX
:
awk -v RS='[ \n]' '/application_[0-9_]+/{a=$0}/\<any_name\>/{print a}' file
awk-vrs='[\n]'/application\[0-9\]+/{a=$0}/\/{print a}文件
它依赖于设置为捕获每个单词的记录分隔符
RS
。application_XXXX
字符串存储在变量a
中,并在找到单词任何_名称
时打印。始终建议将样本包装在代码标签{}
按钮中。始终建议将样本包装在代码标签{}
按钮。所有代码都应该重构成一个Awk脚本。@tripleee我想@oliv已经回答了。他缺少运行状态部分。您只需再添加一个grep
-这很有趣:-)awk'/foo/'文件| awk'{print$1}'
=awk'/foo/{print$1}'文件
。此外,awk使用真正的regexp而不是glob模式/app\u id*/
匹配任何app\u i app\u id app\u idd app\u idddddd
等。您可能指的是/app\u id.*/
(app\u id
后跟任何字符)但是您不需要*
,因为默认情况下awk匹配是无任务的。@Ashutosh更新的命令/解决方案也将丢失应用程序ID:application_1532934978357_248180 application_15329349783879_657880但所有代码都应该重构为单个awk脚本。@tripleee我想@oliv已经回答了。他缺少运行状态部分。您只需再添加一个grep
-这很有趣:-)awk'/foo/'文件| awk'{print$1}'
=awk'/foo/{print$1}'文件
。此外,awk使用真正的regexp而不是glob模式/app\u id*/
匹配任何app\u i app\u id app\u idd app\u idddddd
等。您可能指的是/app\u id.*/
(app\u id
后跟任何字符)但是您不需要*
,因为默认情况下awk匹配是无任务的。@Ashutosh更新的命令/解决方案也将丢失应用程序id:application_1532934978357_248180 application_15329349783879_657880感谢您对解决方案进行编辑和尝试。尽管我在上面尝试时,它只给出了/prints id_标记价值添加更多信息。app\u id->实际上看起来像:app\u xxxx\u xxx(x=整数)。id_标记看起来像:some.string_srting.string。行用“\n”分隔,字段用空格分隔。感谢您的帮助。@cod_enthu请用一个包含您正在描述的用例的示例更新您的问题。请同时给出预期输出。不幸的是,对于给定的示例,我无法提供更多帮助。我现在已经更新了数据集和有问题的预期输出。@Cod|enthu如果是,只需将第二个条件更改为/\\\\/
或/\/\/
,感谢您对解决方案进行编辑和尝试。尽管当我在上面尝试时,它只会给我/prints id|u标记值。添加更多信息。app\u id->实际上看起来像:app\u xxxx\u xxx(x=整数)。id_标记看起来像:some.string_srting.string。行用“\n”分隔,字段用空格分隔。感谢您的帮助。@cod_enthu请用一个包含您正在描述的用例的示例更新您的问题。请同时给出预期输出。不幸的是,对于给定的示例,我无法提供更多帮助。我现在已经更新了数据集和有问题的预期输出。@Cod\u enthu如果是,只需将第2个条件更改为/\\\/
或/\/