grep 2行中的元素并打印出来

时间:2017-08-17 13:38:34

标签: bash awk sed

这是我的问题,我有一个带有条目的文件,我想得到日期+最后一个命令后面的那个“]:”

Aug 17 14:25:17 snaper[22134]: [ip:10.1.15.245 37985 10.1.15.18 22 uid:10000 sid:21680 tty: cwd:/data/www/hybris/hybris/bin/platform filename:/bin/ps]: /bin/ps -p 6763

当我抓住文件时,我怎么能得到它?

我可以通过以下方式获取日期:

awk '{print $1,$2,$3}'

和最后一个命令:

awk -F': ' '{print $NF}'

但是如何将它们组合在一起呢? 我不是awk有限,任何sed grep或其他命令对我来说都可以:) 提前致谢

6 个答案:

答案 0 :(得分:5)

只需删除日期和最后一个命令之间的所有内容:

sed 's/^\(... .. ..:..:..\).*: /\1 /'

答案 1 :(得分:0)

使用AWK的简单解决方案

$awk '{print $1,$2,$3,  $(NF-2), $(NF-1), $NF }' file
Aug 17 14:25:17 /bin/ps -p 6763

答案 2 :(得分:0)

使用GNU grep

grep -oP '^.{15}|.*\]: \K.*' file | paste - -

答案 3 :(得分:0)

可能使用tee将1输出用于2个命令:

echo 'Aug 17 14:25:17 snaper[22134]: [ip:10.1.15.245 37985 10.1.15.18 22 uid:10000 sid:21680 tty: cwd:/data/www/hybris/hybris/bin/platform filename:/bin/ps]: /bin/ps -p 6763' | tee >(awk -F': ' '{print $NF}') | awk '{print $1,$2,$3}' | tr '\n' ' '

我们输出为:

Aug 17 14:25:17 /bin/ps -p 6763 

答案 4 :(得分:0)

$ s="Aug 17 14:25:17 snaper[22134]: [ip:10.1.15.245 37985 10.1.15.18 22 uid:10000 sid:21680 tty: cwd:/data/www/hybris/hybris/bin/platform filename:/bin/ps]: /bin/ps -p 6763"    

使用sed来实现目标,

$ sed -r 's/(^.*:[0-9]{2}) .*]:/\1/' <<< "$s"

答案 5 :(得分:0)

尝试以下解决方案。考虑到您的Input_file将具有与所示示例相同的数据。

解决方案1:使用简单剪切命令。

cut -d" " -f1,2,3,14,15,16  Input_file

解决方案第二:使用awk命令我正在制作字符串snaper和]:作为字段分隔符。

awk -F' snaper|]:' '{print $1,$4}'  Input_file

解决方案3:将记录分隔符作为空格,然后根据OP的请求仅打印我们需要的那些行。

awk -v RS=" " 'NR<4||NR>13{printf("%s%s",$0,NR<3||NR<16?" ":"")}' Input_file

解决方案4:将所有内容从snap更改为:并获取OP的请求。

awk '{sub(/snaper\[.*\]: /,"");print}'  Input_file

解决方案5:在这里使用--re-interval(因为我有旧版本的awk)如果系统中最新的awk版本也可以将其删除。

awk --re-interval '{match($0,/.*[0-9]{2}:[0-9]{2}:[0-9]{2}/);print substr($0,RSTART,RLENGTH),$(NF-2),$(NF-1),$NF}'  Input_file

解决方案6:使用sed并将所有内容替换为snaper然后将所有内容替换为冒号并仅打印匹配。

sed 's/\(.[^s]*\)\(.*:\)\(.*\)/\1\3/'   Input_file