Shell脚本技术咨询:按参数条件输出内容及匹配指定字段
没问题,我来帮你搞定这两个Shell相关的问题~
问题1:保留第一个参数,根据第二个参数的条件决定是否打印
如果是在Shell脚本里处理命令行参数,核心思路就是先把第一个参数存起来,再判断第二个参数是否符合你设定的条件,满足条件就输出第一个参数。
给你几个不同场景的示例:
场景1:判断第二个参数等于指定字符串(比如0005)
#!/bin/bash # 先检查是否传入了足够的参数 if [ $# -lt 2 ]; then echo "请至少传入两个参数哦" exit 1 fi first_arg="$1" second_arg="$2" # 条件判断:第二个参数等于0005时打印第一个参数 if [ "$second_arg" = "0005" ]; then echo "$first_arg" fi
场景2:数值条件判断(比如第二个参数大于5)
如果第二个参数是数值,用-gt(大于)、-lt(小于)这类数值比较运算符:
#!/bin/bash if [ $# -lt 2 ]; then echo "请至少传入两个参数哦" exit 1 fi first_arg="$1" second_arg="$2" if [ "$second_arg" -gt 5 ]; then echo "$first_arg" fi
场景3:模糊匹配条件(比如第二个参数以00开头)
用[[ ]]支持的模式匹配更灵活:
#!/bin/bash if [ $# -lt 2 ]; then echo "请至少传入两个参数哦" exit 1 fi first_arg="$1" second_arg="$2" if [[ "$second_arg" == 00* ]]; then echo "$first_arg" fi
问题2:提取sev为0005时对应的NAME值
这种多行关联的提取需求,用awk工具最合适不过了。假设你的命令输出格式大概是这样(每个条目包含NAME和sev行,可能夹杂其他行):
NAME: SEVERITY
sev: 0005
other_info: xxxNAME: AnotherService
sev: 0003
other_info: yyy
给你几种不同情况的解决方案:
情况1:NAME行在sev行之前
用awk缓存NAME的值,遇到符合条件的sev行时输出:
# 把your_command换成你实际的命令 your_command | awk '/^NAME:/ { name = substr($0, 7) } /^sev:/ && $2 == "0005" { print name }'
解释下这段代码:
/^NAME:/:匹配以NAME:开头的行name = substr($0, 7):提取NAME:后面的内容(从第7个字符开始,跳过NAME:)存到变量里/^sev:/ && $2 == "0005":匹配以sev:开头且第二个字段是0005的行print name:此时输出之前缓存的NAME值
情况2:sev行在NAME行之前
如果输出里sev行可能在NAME前面,调整逻辑先存sev的值,遇到NAME时判断:
your_command | awk '/^sev:/ { sev = $2 } /^NAME:/ && sev == "0005" { print substr($0, 7) }'
情况3:每个条目用空行分隔
如果每个条目之间是空行分隔的,用awk的记录分隔符RS=''把每个块作为独立记录处理:
your_command | awk -v RS='' '/sev: 0005/ { sub(/.*NAME: /, ""); sub(/\nsev:.*/, ""); print }'
这段代码会找到包含sev: 0005的块,提取其中NAME后面的内容并打印。
内容的提问来源于stack exchange,提问作者Joie Tamayo
相关产品推荐
相关产品推荐

