你还没有在你的问题中指定这个,但我猜你有一个文件与关键字,例如,包含x-g301
的文件cmdfile
。然后运行脚本,如:
./script "input_file" "output_file" < cmdfile
如果是这样,第一个grep
命令将在stdin
消耗整个cmdfile
而搜索第一个模式,什么都不会留下第二grep
。这就是为什么第二个grep
,然后你的第二个脚本,没有输出。
有很多方法可以解决这个问题,但是选择正确的方法取决于你想要做什么,以及cmdfile
的外观如何。假设这是与其他事物不仅仅是命令模式更大的文件,你可以通过该文件作为第三个参数给脚本,就像这样:
./script "input_file" "output_file" "cmdfile"
,有你的脚本处理这样的:
#!/bin/bash
input_file="$1"
output_file="$2"
cmdfile="$3"
if grep -q "X-G303" "$cmdfile"; then
awk -f ./mno/script.awk "$input_file" > t1.json
fi
if grep -q "x-g301" "$cmdfile"; then
sh ./mno/tm.sh "$input_file" > t2.json
fi
这里我还假设你的awk
和sh
脚本并不真的需要grep
的输出,因为你给他们输入文件的名字。
请注意,使用grep
进行存在搜索的正确方法是通过其退出代码(以及使用-q
的静音输出)。我们可以使用shortcircuiting(grep ... && awk ...
)代替if
,但这种方式可能更具可读性。
您的'grep'命令没有被传递给一个文件,因此这些命令应该无限期地阻塞为'grep'进程'stdin'。另外,'|'不是一个“或”命令,它是一个将左边命令的输出发送到右边命令输入的管道,向我们展示您正在使用的实际shell可能很有用而不是'(shell)',尽管'bash'标签可能是一个很好的线索 –
感谢您的注意。我纠正它,它正在工作! –