想象一下,我有一个日志文件或下面的文本文件
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命令执行此操作?。
答案 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'
解释一下。
详细说明:
答案 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