我的unix服务器上有一个巨大的文件,我需要从中提取某些部分
该行的格式为
aNumber timestamp commandInformation
我使用命令
grep LATENCY file.log | grep CMDTYPE=NEW
过滤掉我想要的某些行。我只希望返回部分时间戳和行中的最后9个字符,而不是整行。我怎么能这样做?
答案 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
提取行的一部分的人添加了答案,其中正则表达式是他们要提取的部分。]