【问题标题】:How to ignore line in shell script and print only required lines如何忽略 shell 脚本中的行并仅打印所需的行
【发布时间】:2021-11-19 13:33:49
【问题描述】:

感谢您关注我的问题!

我开发了一个脚本 run.sh,它创建了一个 output.txt 文件并将输出存储在该文件中。但是输出有多个不需要的行。我希望脚本忽略这些行,只粘贴所需的行-

输出-

*
*
*
adhkjhajsdkjhas
asdjkakjdhajskh
HSHDKJ
jdkjadjk
sajkdhakjh
ajhdjs
*
*
*
     A565253662     Value
1.   abc           01Nov2019
2.   cde           03Dec2019
3.   def           04Feb2020
4.   hij           16Aug2021
5.   klm           07Dec2021
*
*
*
     A565253665     Value
1.   abc           23Sep2019
2.   cde           24Sep2019
3.   def           01Aug2020
4.   hij           09Sep2021
5.   klm           23Sep2021
*
*
*

但我希望 output.txt 只打印下面的输出而不是上面的输出-

     A565253662     Value
1.   abc           01Nov2019
2.   cde           03Dec2019
3.   def           04Feb2020
4.   hij           16Aug2021
5.   klm           07Dec2021
     A565253665     Value
1.   abc           23Sep2019
2.   cde           24Sep2019
3.   def           01Aug2020
4.   hij           09Sep2021
5.   klm           23Sep2021

注意 - 列名并不总是相同,并且

*
*
*
adhkjhajsdkjhas
asdjkakjdhajskh
HSHDKJ
jdkjadjk
sajkdhakjh
ajhdjs
*
*
*

这些行有时也是大写。

我尝试过 read、foreach 和 line,但可能使用错误,因为我是 shell 新手。如果有人对此有任何解决方案..请帮助.. PS 提前致谢 :)

【问题讨论】:

  • 使用 egrepcat file.txt | egrep -v '/^\*/'

标签: linux bash shell sh ch


【解决方案1】:

您并没有真正提供足够的信息,但是如果您想打印第二列是文本“值”的行以及随后的 5 行,您可以简单地这样做:

awk '$2 == "Value"{a = 6} a-- > 0'

每当看到第二列是“值”的行时,都会设置一个计数器(变量 a)。然后它会在随后的每一行中递减该计数器,在计数器保持大于 0 时打印该行。

但是,如果您不只是想打印 'Value' 之后的 5 行,而只想打印所有以数字开头的行,您可以这样做:

awk 'a && ! /^[0-9]/ { a = 0 } $2 == "Value" { a = 1} a' 

如果您想继续打印,直到看到以星号开头的行,您可以这样做:

awk 'a && /^\*/ { a = 0 } $2 == "Value" { a = 1} a' 

或者您可能只想打印多于 1 列的行:

awk 'NF > 1' 

您需要准确地描述要打印的线条。

一旦你决定如何描述你想要保留的行,你可以做run.sh | awk ...,或者继续将run.sh的输出写入output.txt,然后用awk ... output.txt过滤文件(例如,run.sh | awk 'NF>1'awk 'NF>1' output.txt

【讨论】:

    【解决方案2】:

    您可以使用 grep,搜索始终在您想要的输出中的字符串,如下所示:

    cat output.txt | grep '\.\|Value'
    

    如果 output.txt 是:

    *
    *
    *
    adhkjhajsdkjhas
    asdjkakjdhajskh
    HSHDKJ
    jdkjadjk
    sajkdhakjh
    ajhdjs
    *
    *
    *
         A565253662     Value
    1.   abc           01Nov2019
    2.   cde           03Dec2019
    3.   def           04Feb2020
    4.   hij           16Aug2021
    5.   klm           07Dec2021
    *
    *
    *
         A565253665     Value
    1.   abc           23Sep2019
    2.   cde           24Sep2019
    3.   def           01Aug2020
    4.   hij           09Sep2021
    5.   klm           23Sep2021
    *
    *
    *
    

    它会给你:

         A565253662     Value
    1.   abc           01Nov2019
    2.   cde           03Dec2019
    3.   def           04Feb2020
    4.   hij           16Aug2021
    5.   klm           07Dec2021
         A565253665     Value
    1.   abc           23Sep2019
    2.   cde           24Sep2019
    3.   def           01Aug2020
    4.   hij           09Sep2021
    5.   klm           23Sep2021
    

    【讨论】:

      【解决方案3】:

      记一下

      $ grep -Ei '[0-9]*\.|value' file
           A565253662     Value
      1.   abc           01Nov2019
      2.   cde           03Dec2019
      3.   def           04Feb2020
      4.   hij           16Aug2021
      5.   klm           07Dec2021
           A565253665     Value
      1.   abc           23Sep2019
      2.   cde           24Sep2019
      3.   def           01Aug2020
      4.   hij           09Sep2021
      5.   klm           23Sep2021
      

      如果你想像这样保存它而不是把这个 grep 放在管道中:

      your_command_to_generate_log | grep -Ei '[0-9]*\.|value' > output.txt
      

      【讨论】:

      • 嗨@Ivan 和@javiervidrua 谢谢你的回答,但两个答案只对一半有效,因为我忘了提到列名并不总是常见的......而且它也没有忽略出于某种原因,前几行是adhkjhajsdkjhas asdjkakjdhajskh HSHDKJ jdkjadjk sajkdhakjh ajhdjs,仅打印此输出
      • '`asdjkakjdhajskh hshdkj jdkjadjk sajkdhakjh ajhdjs a565253662值1.abc 01nov2019 2. CDE 03DEC2019 3. DEF 04FEB2020 4. HIJ 16Aug2021 5. KLM 07DEC2021 A565253665值``` SPAN>
      猜你喜欢
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多