如果行匹配,则解析stdout并运行命令

时间:2016-09-20 12:20:16

标签: unix command-line-interface xargs

我想解析一个命令的stdout并在一行匹配时运行一个命令。例如,cat cities.txt的输出是

paris
amsterdam
munich
berlin
london
brussels

我想回复同一个列表,但是对任何以字母b开头的城市运行命令。

cat cities.txt | <command here ... echo $city starts with b>

应输出类似

的内容
paris
amsterdam
munich
berlin
berlin starts with b
london
brussels
brussels starts with b

2 个答案:

答案 0 :(得分:2)

一个简单的bash脚本: -

#!/bin/bash

while IFS= read -r line
do
    [[ $line == b* ]] && echo -e "$line\n$line starts with b" || echo "$line"
done <file

运行脚本会产生

$ bash script.sh
paris
amsterdam
munich
berlin
berlin starts with b
london
brussels
brussels starts with b

步骤: -

  1. 逐行阅读文件
  2. 如果行以'b'开头,则根据需要附加字符串,否则将其添加为
  3. 避免无用地使用'cat'命令<(file)进程替换完成
  4. 在这种情况下,

    echo具有-e标记,可以解释特殊字符\n

    您可以为匹配行运行一些其他命令,方法是在匹配它们的echo部分之后替换&&,并在||条件之后替换不匹配的行。我已经使用伪命令名cmd_for_matching_linescmd_for_non_matching_lines演示了相同的内容。

    #!/bin/bash
    
    while IFS= read -r line
    do
        [[ $line == b* ]] && cmd_for_matching_lines "$line" || cmd_for_non_matching_lines "$line"
    done <file
    

答案 1 :(得分:2)

便携式解决方案,没有诸如[[ ]]之类的基本原理,我将其写为

#!/bin/sh
while read city; do
  case $city in
    (b*) echo $city starts with b;;
  esac
done < cities.txt

请注意,如何将其扩展为不区分大小写(请改用([Bb]*))并使用其他首字母的测试进行扩充。