Как удалить символы типа (), '* [], чтобы получить результаты grep с помощью grep, awk или sed? - PullRequest
0 голосов
/ 17 января 2011

Например, если я создал файл с помощью grep, который даст мне следующий результат:

16 Jan 07:18:42 (name1), xx.210.49.xx),
16 Jan 07:19:14 (name2), xx.210.xx.24),
16 Jan 07:19:17 (name3), xx.140.xxx.79),
16 Jan 07:19:44 (name4), xx.210.49.xx),
16 Jan 07:19:56 (name5), xx.140.xxx.79),

, то как с помощью sed awk или grep удалить все, кроме имени даты и IP, чтобы это выглядело так:

16 Jan 07:18:42 name1 xx.210.49.xx
16 Jan 07:19:14 name2 xx.210.xx.24
16 Jan 07:19:17 name3 xx.140.xxx.79
16 Jan 07:19:44 name4 xx.210.49.xx
16 Jan 07:19:56 name5 xx.140.xxx.79

Моя команда grep выглядит следующим образом:

grep 'double' $DAEMON | awk -F" " '{print $2" "$1" "$3" "$8" "$10}'  > $DBLOG

Thx.

Ответы [ 5 ]

3 голосов
/ 19 ноября 2011

Если вы просто хотите удалить определенные символы, вы можете посмотреть на команду tr с параметром -d:

$ echo "16 Jan 07:18:42 (name1), xx.210.49.xx)," | tr -d "(),*'[]"
16 Jan 07:18:42 name1 xx.210.49.xx
1 голос
/ 20 ноября 2011
[jaypal@MBP-13~/temp] cat file1
16 Jan 07:18:42 (name1), xx.210.49.xx),
16 Jan 07:19:14 (name2), xx.210.xx.24),
16 Jan 07:19:17 (name3), xx.140.xxx.79),
16 Jan 07:19:44 (name4), xx.210.49.xx),
16 Jan 07:19:56 (name5), xx.140.xxx.79),

[jaypal@MBP-13~/temp] sed 's/\(.*[^(]\)(\(.*\)),\(.*\)),/\1\2\3/g' file1
16 Jan 07:18:42 name1 xx.210.49.xx
16 Jan 07:19:14 name2 xx.210.xx.24
16 Jan 07:19:17 name3 xx.140.xxx.79
16 Jan 07:19:44 name4 xx.210.49.xx
16 Jan 07:19:56 name5 xx.140.xxx.79
1 голос
/ 17 января 2011

Разбивка ответа ghostdog74:

awk '
    /double/ {
        gsub(/[(),\[\]]/, "")
        print $2" "$1" "$3" "$8" "$10
    }
'

/double/ приказывает awk выполнять вещи в { } только для строк, содержащих double (/double/ - это регулярное выражение).

gsub ожидает, что первый аргумент будет регулярным выражением, второй аргумент будет строкой подстановки, а третий аргумент будет переменной, над которой выполняется подстановка. Если третий аргумент не указан (как в этом случае), по умолчанию используется $0, что соответствует всей строке.

Я добавил \[ и \] к регулярному выражению, которое должно соответствовать [ и ] символам в дополнение к (, ) и ,.

Как правило, когда вы комбинируете awk, sed или grep, почти всегда есть способ сделать то, что вам нужно, с помощью sed или awk.

1 голос
/ 19 ноября 2011

С sed

$> cat ./text | sed -r -e 's/(\(|\)\,)//g'
16 Jan 07:18:42 name1 xx.210.49.xx
16 Jan 07:19:14 name2 xx.210.xx.24
16 Jan 07:19:17 name3 xx.140.xxx.79
16 Jan 07:19:44 name4 xx.210.49.xx
16 Jan 07:19:56 name5 xx.140.xxx.79

Inb4 UselesUseOfCat: cat ./text здесь аналогично для вывода grep ОП.

1 голос
/ 17 января 2011

вы можете сделать это с помощью одной команды awk.не нужно использовать grep

awk '/double/{gsub("[(),]","",$8); gsub("[(),]","",$10);print $2" "$1" "$3" "$8" "$10}'

или просто

awk '/double/{gsub("[(),]","");print $2" "$1" "$3" "$8" "$10}'

, если вам также необходимо удалить [], используйте этот шаблон: gsub("[][(),]","")

...