我是否可以使用awk
或sed
我没有使用awk
或sed
,因为我使用的文本文件没有固定的列数及其排列更改。例如,我有一个名为error1.txt
的文本文件,其中包含许多这样的行:
>304 00000800020030000000000032000AC00000000032000AC00000000000000000000000000000000022000000000 00000 \Device\Termdd en-US Classic Error Description 1. System MAN-RW-ADC1.PH.NIIT.com 50
>50 49162 49162 18256 18256 0x80000000000000 2 2 TermDD 0 11/10/2013 11:47
如果我想得到这些话:
Error Description 1
11/10/2013
11:47
我现在唯一能做的就是:
`egrep '(Error.*Description.*1)' /home/xxxxxx/Documents/error1.txt`
我应该使用什么命令来反转没有sed
或awk
?
答案 0 :(得分:2)
使用sed
sed -r 's/.*(Error Description [0-9]*).*([0-9]{2}\/[0-9]{2}\/[0-9]{4}\ [0-9]{2}:[0-9]{2})$/\1 \2/' error1.txt
Error Description 1 11/10/2013 11:47
grep with -P
grep -iPo "Error.*Description.*1.*\K[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}$" error1.txt
11/10/2013 11:47
答案 1 :(得分:0)
grep -o
会给你一部分结果字符串,所以
cat<<EOF |
304 00000800020030000000000032000AC00000000032000AC00000000000000000000000000000000022000000000 00000 \Device\Termdd en-US Classic Error Description 1. System MAN-RW-ADC1.PH.NIIT.com 50 >50 49162 49162 18256 18256 0x80000000000000 2 2 TermDD 0 11/10/2013 11:47
EOF
grep -o 'Error Description [0-9]*'
将产生Error Description 1
。问题是它不会在同一条线上获得时间戳,也不会抓住其间的所有剩余垃圾。如果您想将结果存储在两个单独的行中(一次用于Error Description
,一次用于时间戳),您可以将每行保存到变量中并grep
。
否则,sed
和awk
会给出最简洁的结果,因为它会让您使用位置替换。
是否有一个特殊原因你不能使用这两个?
答案 2 :(得分:0)
以下是使用bash正则表达式的方法:
$ re="(Error Description [[:digit:]]*).*([[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}[[:space:]]*[[:digit:]]{2}:[[:digit:]]{2})"
$ while IFS='' read -r ln; do [[ $ln =~ $re ]] && echo "${BASH_REMATCH[@]:1:2}"; done < error1.txt
Error Description 1 11/10/2013 11:47
$