我正在编写一个Bash脚本,我需要查看命令的输出并根据该输出执行某些操作。为清楚起见,此命令将输出几百万行文本,这可能需要大约一个小时左右才能完成。
目前,我正在执行命令并将其管道到一个while循环中,该循环一次读取一行,然后查找某些条件。如果存在该标准,则更新.dat文件并重新打印屏幕。下面是该剧本的片段。
eval "$command"| while read line ; do
if grep -Fq "Specific :: Criterion"; then
#pull the sixth word from the line which will have the data I need
temp=$(echo "$line" | awk '{ printf $6 }')
#sanity check the data
echo "\$line = $line"
echo "\$temp = $temp"
#then push $temp through a case statement that does what I need it to do.
fi
done
所以问题就在这里,对数据的健全性检查显示出奇怪的结果。打印线不包含grep标准。
为了确保我的grep语句正常工作,我grep包含该命令输出的文本记录的日志文件,它只输出包含指定条件的行。
我对Bash还不太新,所以我不确定发生了什么。可能是命令强制为while循环提供一个新的$ line,然后才能处理符合grep标准的$ line?
任何想法都会非常感激!
答案 0 :(得分:2)
grep如何知道线条是什么样的?
if ( printf '%s\n' "$line" | grep -Fq "Specific :: Criterion"); then
但我不能帮你觉得你太复杂了。
function process() {
echo "I can do anything I want"
echo " per element $1"
echo " that I want here"
}
export -f process
$command | grep -F "Specific :: Criterion" | awk '{print $6}' | xargs -I % -n 1 bash -c "process %";
运行命令,仅过滤匹配的行,然后拉出第六个元素。然后,如果您需要在其上运行任意代码,请通过xargs将其发送到函数(导出以使其在子进程中可见)。
答案 1 :(得分:1)
你在申请grep的是什么?
修改
if grep -Fq "Specific :: Criterion"; then
如下
if ( echo $line | grep -Fq "Specific :: Criterion" ); then