如何在不使用awk或sed的情况下获得不匹配的行?

时间:2014-01-16 00:12:16

标签: bash

我是否可以使用awksed

获取不匹配的

我没有使用awksed,因为我使用的文本文件没有固定的列数及其排列更改。例如,我有一个名为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`

我应该使用什么命令来反转没有sedawk

的匹配项

3 个答案:

答案 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

否则,sedawk会给出最简洁的结果,因为它会让您使用位置替换。

是否有一个特殊原因你不能使用这两个?

答案 2 :(得分:0)

以下是使用正则表达式的方法:

$ 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
$