【问题标题】:Using awk and grep command in for loop在 for 循环中使用 awk 和 grep 命令
【发布时间】:2015-08-17 03:55:36
【问题描述】:

考虑下面的代码sn-p:

#! /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

我在文件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。在上述情况下,日期和时间打印在不同的行中。

【问题讨论】:

    标签: shell awk grep ksh


    【解决方案1】:

    问题在于您使用的是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
    

    【讨论】:

      【解决方案2】:

      永远不需要管道中的多个greps 和awks。大多数情况下,只需一个工具即可完成这项工作:

      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
      

      【讨论】:

      • 感谢您的回复。我正在使用 ksh 外壳。 ksh 中的 grep 选项 -oP 有什么替代方法吗?
      • @user2531564 这也适用于 ksh,我对其进行了测试。你的 grep 版本是什么:grep --version
      • 我使用的是 solaris UNIX 5.10 Generic_147147-26 sun4u sparc SUNW,SPARC-Enterprise
      • @user2531564 我没有要测试的 solaris 盒子,抱歉。但是,然后使用您问题中的部分。只需按照我的问题中提到的设置 IFS 变量即可。或者while 解决方案:grep ... | grep .. | awk ... | while read line; do ... done,也可以使用
      • 嘿.. 它工作.. 我将使用 while 循环.. 非常感谢。能否请您告诉我 while 循环优于 for 循环的优势。
      猜你喜欢
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      相关资源
      最近更新 更多