在 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
。在上述情况下,日期和时间打印在不同的行中。
永远不需要管道中的 多个 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
问题是您使用的是 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
考虑以下代码片段:
#! /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
。在上述情况下,日期和时间打印在不同的行中。
多个 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
问题是您使用的是 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