在grep之后得到一条线的一部分

时间:2009-09-24 12:54:54

标签: unix file grep

我的unix服务器上有一个巨大的文件,我需要从中提取某些部分

该行的格式为

aNumber timestamp commandInformation

我使用命令

grep LATENCY file.log | grep CMDTYPE=NEW

过滤掉我想要的某些行。我只希望返回部分时间戳和行中的最后9个字符,而不是整行。我怎么能这样做?

7 个答案:

答案 0 :(得分:10)

使用awk(1)

awk ' { print $2" "substr($0,length($0)-8) }'

答案 1 :(得分:9)

cut必须完成这项工作

grep something somewhere | grep againsomething | cut -f2 -d' '

答案 2 :(得分:2)

我认为perl是比awk更好的选择:

perl -ne 'next if ! (/LATENCY|CMDTYPE=NEW/ && /^\d+.*\s+(.*)\s+.*(.{9})$/); print "$2 $3\n";'

正则表达式更强大,允许您省略与更严格的模式不匹配的行。上面的awk脚本会看到substr调用中的溢出(老实说,我不知道在awk中有什么负面索引)如果你从日志末尾提供像部分行这样的破坏输入。

答案 3 :(得分:1)

您可以按如下方式使用awk

grep LATENCY file.log | grep CMDTYPE=NEW | awk '{print $2,substr($0,length($0)-9,9)}'

答案 4 :(得分:0)

不需要使用grep,awk也可以这样做:

awk '/LATENCY/ && /CMDTYPE=NEW/ {print $2 " " substr($0, length($0)-8)}' file

答案 5 :(得分:0)

你可以单独使用sed做任何事情:

$ echo "234432 12:44:22.432095 LATENCY blah CMDTYPE=NEW foo bar 123456789" | \
sed -n '/LATENCY/!b;/CMDTYPE=NEW/!b;s/^.\+\s\+\([0-9:.]\+\)\s.\+\(.........\)$/\1 \2/; p'
12:44:22.432095 123456789

答案 6 :(得分:0)

您可以使用grep使用-o来完成所有操作,该命令仅输出匹配项,而不输出整行。

假设您可以为时间戳和行的其余部分创建一个正则表达式,则只需添加:

... | grep -o regex  

[为所有尝试使用grep提取行的一部分的人添加了答案,其中正则表达式是他们要提取的部分。]