请考虑以下代码段:
#! /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
。在上述情况下,日期和时间以不同的行显示。
答案 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)
管道中的多个grep
和awk
永远不需要。大部分工作可以通过一个工具完成:
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