【问题标题】:Extracting text from file using bash使用bash从文件中提取文本
【发布时间】:2013-01-07 22:10:27
【问题描述】:

我是 Linux 新手,我有一个非常大的文本日志文件可以从中提取。我想使用 bash?

例如,文件包含:

Node:xyz
Time:01/07/13 14:26:17
INFO: Trusted certif ok

Node:abc
Time:01/07/13 14:26:18
INFO: Trusted certif ok

Node:def
Time:01/07/13 14:26:18
INFO: Trusted certif not ok

我需要提取 Node: 之后的文本并将其添加到 Info: 之后的文本中以显示在一行上,输出重定向到新文件。我正在尝试 awk 和 sed,但还没有弄清楚。非常感谢帮助。

示例输出如下所示:

xyz Trusted certif ok
abc Trusted certif ok
dbf Trusted certif not ok

【问题讨论】:

    标签: bash sed awk


    【解决方案1】:

    尝试这样做:

    awk -F: '/^Node/{v=$2}/^INFO/{print v $2}' file.txt
    

    while IFS=: read -r c1 c2; do
        [[ $c1 == Node ]] && var=$c1
        [[ $c1 == INFO ]] && echo "$var$c2"
    done < file.txt
    

    perl -F: -lane '
        $v = $F[1] if $F[0] eq "Node";
        print $v, $F[1] if $F[0] eq "INFO"
    ' file.txt
    

    (在文件中,用法:./script.py file.txt):

    import sys
    file = open(sys.argv[1])
    while 1:
        line = file.readline()
        tpl = line.split(":")
        if tpl[0] == "Node":
            var = tpl[0]
        if tpl[0] == "INFO":
            print var, tpl[1]
        if not line:
            break
    

    【讨论】:

    • 非常感谢大家。 awk 很棒,您的帮助也很棒。
    • @EdMorton:纯bash 解决方案有什么问题?
    • @TrueY shell 是一个调用工具的环境。它具有编程语言结构(循环等),可帮助您对调用工具的顺序进行排序。它不是解析文本文件的工具,因此它的功能非常有限,而且副作用不明显。例如,由于 read 缺少 -r 参数,您发布的脚本将错误地解释反斜杠,并且使用 echo 仅适用于具有某些输入的某些系统。可能还有其他边缘情况会失败,并且它的长度是健壮的 awk 脚本长度的两倍多。
    • @EdMorton:明白!谢谢!
    • @canfiese: 试试 gawk
    【解决方案2】:

    使用 sed:

    sed -n '/^Node/N;/Time/N;s/^Node:\([^\n]*\)\n[^\n]*\n[^ ]* /\1 /p' input
    

    【讨论】:

      【解决方案3】:
      perl -F: -lane '$x=$F[1] if(/^Node:/);if(/^INFO:/){print "$x".$F[1];}' your_file
      

      测试如下:

      > cat temp
      Node:xyz
      Time:01/07/13 14:26:17
      INFO: Trusted certif ok
      
      Node:abc
      Time:01/07/13 14:26:18
      INFO: Trusted certif ok
      
      Node:def
      Time:01/07/13 14:26:18
      INFO: Trusted certif not ok
      
      > perl -F: -lane '$x=$F[1] if(/^Node:/);if(/^INFO:/){print "$x".$F[1];}' temp
      xyz  Trusted certif ok
      abc  Trusted certif ok
      def  Trusted certif not ok
      

      【讨论】:

        【解决方案4】:
        sed -n 'N;N;s/\n.*\n/ /;s/\S*://g;p;n' file
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-05
          相关资源
          最近更新 更多