代码之家  ›  专栏  ›  技术社区  ›  Daniel

使用tee和while循环的Bash进程替换用法

  •  0
  • Daniel  · 技术社区  · 7 年前

    我想用 嵌套

    while read line; do
      #process line
      echo "--$line"
    done < <(cat sample.file | tee >(grep "SPECLINE") | grep "LINESTOPROCESS")
    

    • 所有线路sample.file文件包含“LINETOPROCESS”表达式的函数应该传递到循环中,并且它们将以“-”前缀打印。
    • 所有包含“SPECLINE”的行需要在tee的第一个进程替换中打印(在grep中)。

    我想避免猫叮sample.file文件不止一次,因为它太大太重了。

    用一个简单的样品.试验文件:

    line1 SPECLINE
    line2 LINETOPROCESS
    line3 LINETOPROCESS
    line4 SPECLINE
    line5 I don't need it
    line6 also not
    line7 also not
    line8 SPECLINE
    line9 LINETOPROCESS
    

    我的结果:

    # ./test.sh
    #
    

    我想要的结果:

    # ./test.sh
    line1 SPECLINE 
    --line2 LINETOPROCESS
    --line3 LINETOPROCESS
    line4 SPECLINE
    line8 SPECLINE
    --line9 LINETOPROCESS
    

    # ./test.sh
    --line2 LINETOPROCESS
    --line3 LINETOPROCESS
    --line9 LINETOPROCESS
    line1 SPECLINE 
    line4 SPECLINE
    line8 SPECLINE
    

    更新1

    greps只用于演示。 我真的需要那两个替代品。

    • sample.file文件是一个http文件。
    • grep“SPECLINE”应该是“hxselect-i-s”;“-c”分时'
    • grep“LINESTOPROCESS”将是“hxselect-i-s”;“-c”其他类别'水管

    因此,tee的第一个命令将使用“hour”类选择div,并用“;”分隔它们。然后,tee之后的管道将选择所有具有“otherclass”类的div,hxpipe将其展平以供循环进一步处理。

    3 回复  |  直到 7 年前
        1
  •  3
  •   chepner    7 年前

    我不会使用任何进程替换。

    while IFS= read -r line; do
      if [[ $line = *SPECLINE* ]]; then
        printf '%s\n' "$line"
      elif [[ $line = *LINETOPROCESS* ]]; then
        printf '--%s\n' "$line"
      fi
    done < sample.txt
    

    您已经在支付逐行读取输入流的成本 bash ;没有理由增加两个独立的 grep 处理它。

    awk 过程会更好,因为它比 猛击

    awk '/SPECLINE/ {print} /LINETOPROCESS/ {print "--"$0}' sample.txt
    

    (即 如果一行代码可以同时匹配 SPECLINE LINETOPROCESS

        2
  •  0
  •   Ralf    7 年前

    下面的代码遍历整个文件并打印匹配的行。忽略所有其他行。

    while read line; do
        case "$line" in
            *SPECLINE*) echo "$line" ;;
            *LINETOPROCESS*) echo "--$line" ;;
        esac
    done < sample.file
    
        3
  •  0
  •   Walter A    7 年前

    当你想要 tee ,您可以进行2个更改。
    S
    output process子语句给出了如下问题 https://stackoverflow.com/a/42766913/3220113 解释。你可以用不同的方法。

    while IFS= read -r line; do
      #process line
      echo "--$line"
    done < x2 |
    tee >(grep "SPECLINE") >(grep "LINETOPROCESS") >/dev/null
    

    hxselect ,但它似乎在一个完整的格式良好的XML文档上操作,因此请避免 grep .

    推荐文章