使用bash从文件中提取文本

4
我是一名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
4个回答

13

尝试执行以下操作:

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 真是太棒了,你们的帮助也同样出色。 - Allen
@EdMorton:纯bash解决方案有什么问题吗? - TrueY
@TrueY shell是一个环境,用于调用工具。它具有编程语言结构(循环等),以帮助您按照调用工具的顺序进行排序。它不是用于解析文本文件的工具,因此其执行此操作的能力非常有限,而且其副作用并不明显。例如,由于read缺少-r参数,您发布的脚本将错误地解释反斜杠,并且使用echo仅适用于某些系统和某些输入。它可能存在其他失败的边缘情况,并且其长度超过了强大的awk脚本的两倍。 - Ed Morton
@TrueY 请参阅 为什么使用shell循环处理文本被认为是不良实践 ,以了解为何应避免使用bash解决方案的详细解释。 - Ed Morton
1
@canfiese: 尝试使用gawk。 - Gilles Quénot
显示剩余4条评论

2

使用sed:

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

0
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

0
sed -n 'N;N;s/\n.*\n/ /;s/\S*://g;p;n' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接