如何使用grep和sed打印多个String?

时间:2014-12-16 19:51:50

标签: linux sed grep command

想象一下,我有一个日志文件或下面的文本文件

16 Dec 2014 11:20:00 [INFO] com.example.Test.java PlaneName: JetAirways360 This flight just cleaned up
16 Dec 2014 11:22:01 [INFO] com.example.Test.java PlaneName: JetAirways360 This flight is in queue
16 Dec 2014 11:23:02 [INFO] com.example.Test.java PlaneName: JetAirways360 This flight passengers loaded
16 Dec 2014 11:24:03 [INFO] com.example.Test.State.java PlaneName: JetAirways360 This flight ready to take off
16 Dec 2014 11:25:00 [INFO] com.example.Test.State.java PlaneName: JetAirways360 This flight took off
17 Dec 2014 11:25:00 [INFO] com.example.Test.java PlaneName: JetAirways360 This flight returned back

现在想象一下,这个日志文件完全填满了大量的航班信息。听到它找到特定的航班信息。现在我想看看以下细节

16 Dec 2014 11:20:00 This flight just cleaned up
16 Dec 2014 11:22:01 This flight is in queue
16 Dec 2014 11:23:02 This flight passengers loaded
16 Dec 2014 11:24:03 This flight ready to take off
16 Dec 2014 11:25:00 This flight took off
17 Dec 2014 11:25:00 This flight returned back

如何使用grep和sed命令执行此操作?。

6 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed -rn '/JetAirWays360/s/(.{21}).{54}/\1/p' file

这会将文件的第一部分保存在后引用中,并用它替换剩余文件的一部分。

答案 1 :(得分:1)

这对awk文件

很简单
awk -F" [[]|JetAirways360 " '{print $1,$3}' file
16 Dec 2014 11:20:00 This flight just cleaned up
16 Dec 2014 11:22:01 This flight is in queue
16 Dec 2014 11:23:02 This flight passengers loaded
16 Dec 2014 11:24:03 This flight ready to take off
16 Dec 2014 11:25:00 This flight took off
17 Dec 2014 11:25:00 This flight returned back

答案 2 :(得分:1)

sed -n '/\[.*JetAirways360/ s///p' YourFile

应根据您的样本完成您的工作

答案 3 :(得分:0)

grep 'JetAirways360' lofFile | sed -e 's/\(.*\) \[INFO.*JetAirways360\(.*\)/\1 \2/g'

解释一下。

  1. 首先,我要点击所有包含JetAirways360的日志条目。
  2. 我正在使用sed。每个括号(。)是我想从日志中获取的。 \ 1表示第一个(。),\ 2表示第二个(。*)。它就像从原始行切割的字符串值的打印语句。
  3. 详细说明:

    1. sed正则表达式应包含在此s / / g
    2. 之间
    3. \ 1和\ 2是(。*)。
    4. 的打印语句
    5. (。)表示为(。)。逃生序列
    6. s /(.*) [INFO此解释将所有字符放入括号中,直到您看到[INFO(我已为[和因此[INFO]设置转义字符\)。这就是我如何使用\ 1
    7. 选择和打印日期
    8. [INFO。 JetAirways360(。)这解释了,看到[INFO开始忽略直到看到JetAirways360。之后将所有剩余的字符放入括号中。这就是我如何使用\ 2
    9. 选择和打印日志消息

答案 4 :(得分:0)

使用sed执行此操作有很多方法,下面的命令也可以。

   sed 's#\([[:digit:]]\{2,2\}.*[[:digit:]]\{2,2\}:[[:digit:]]\{2,2\}:[[:digit:]]\{2,2\}\).*PlaneName.*JetAirways360 \(.*\)#\1 \2#g' 'my_log_file'

它标记了直到飞行时间的前两行数字并记住它。然后sed在线上搜索JetAirways360,在此名称后面标记该线的剩余部分。然后将这两种模式结合起来。

使用grep并剪切

在不使用grep或sed的情况下执行此操作的另一个更简单的方法是使用“cut”(即使这可能与回答您的问题无关)

cut -d ' ' -f1-4,9- 'my_log.txt'

从字段(在这种情况下为列)打印1到4,然后打印字段9

结果使用“cut”

16 Dec 2014 11:20:00 This flight just cleaned up
16 Dec 2014 11:22:01 This flight is in queue
16 Dec 2014 11:23:02 This flight passengers loaded
16 Dec 2014 11:24:03 This flight ready to take off
16 Dec 2014 11:25:00 This flight took off
17 Dec 2014 11:25:00 This flight returned back

注意:这只会删除您需要的列,并且不会输出任何灰心,也不会涉及“sedding”。

您还可以使用grep作为平面名称,该名称将使用平面名称打印所有行,然后使用“剪切”

示例

grep "JetAirways36" 'my_log.txt'|cut -d ' ' -f1-4,9-

答案 5 :(得分:0)

perl -ne 'print if s!.INFO.*Name: JetAirways360!!' file

如果您更喜欢新命令flygrep

#!/usr/bin/perl -n 
BEGIN{ $fl = shift;}   
print if s!.INFO.*Name: $fl !! 

用法:flygrep JetAirways360 file