在 for 循环中使用 awk 和 grep 命令

Using awk and grep command in for loop

考虑以下代码片段:

#! /bin/ksh
for i in `grep "ProcessOrderWebService-N" Orders.Log | grep "::stringFromNetwork  =  600001" | awk -F',' '{print }'`; do
    echo $i;
done;

2015-05-26
10:20:10
2015-05-26
10:20:49
2015-05-26
10:21:45

在命令提示符下,当我 运行 命令时:

grep "ProcessOrderWebService-N" Orders.Log | grep "::stringFromNetwork  =  600001" | awk -F',' '{print }'

收到的输出如下。

2015-05-26 10:20:10
2015-05-26 10:20:49
2015-05-26 10:21:45

我在文件Orders.Log中搜索的grep模式如下:

2015-05-26 10:20:10,847 : ProcessOrderWebService-N|220082|1|::stringFromNetwork  =  600001 - reference number is 26000033

基本上我想在for循环中得到输出2015-05-26 10:20:10。在上述情况下,日期和时间打印在不同的行中。

永远不需要管道中的

多个 grepawk。大多数工作可以用一个工具完成:

grep -oP '^[^,]+(?=.*ProcessOrderWebService-N.*::stringFromNetwork  =  600001)' file

给出想要的列表。如果您确实需要 for 循环,则必须先更改 internal field separator

IFS=$'\n'
for line in $(grep -oP '^[^,]+(?=.*ProcessOrderWebService-N.*::stringFromNetwork  =  600001)' file); do
  echo $line
done

但是,我推荐一个 while 循环,当你处理行时:

grep -oP '^[^,]+(?=.*ProcessOrderWebService-N.*::stringFromNetwork  =  600001)' file | while read line; do
  echo $line
done

问题是您使用的是 for 循环,它遍历($IFS 分隔)words 而不是 lines.使用 while read 循环遍历行:

#!/bin/ksh
grep "ProcessOrderWebService-N" Orders.Log |
grep "::stringFromNetwork  =  600001" |
awk -F',' '{print }' |
while IFS= read -r line; do
    echo "$line"
done

然而,正如 chaos 所暗示的那样,所有工作都可以在一个工具中完成。在您的 solaris 机器上,awk 将是更好的工具:

awk -F, '/ProcessOrderWebService-N/ && /::stringFromNetwork  =  600001/ {print }' Orders.Log