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

时间:2015-06-03 05:38:21

标签: shell awk grep ksh

请考虑以下代码段:

#! /bin/ksh
for i in `grep "ProcessOrderWebService-N" Orders.Log | grep "::stringFromNetwork  =  600001" | awk -F',' '{print $1}'`; 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 $1}'

收到的输出如下。

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

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

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

基本上我想将for循环中的输出作为2015-05-26 10:20:10。在上述情况下,日期和时间以不同的行显示。

2 个答案:

答案 0 :(得分:2)

问题是你正在使用for循环,它迭代($ IFS分隔)而非。使用while read循环迭代行:

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

然而,正如混乱所暗示的那样,所有工作都可以在一个工具中完成。在你的solaris盒子上,awk将是更好的工具:

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

答案 1 :(得分:0)

管道中的多个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