这是我的问题,我有一个带有条目的文件,我想得到日期+最后一个命令后面的那个“]:”
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或其他命令对我来说都可以:) 提前致谢
答案 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