2011-01-17 3 views
0

Например, если я сделал файл с Grep, которые дают мне следующий результат:Как удалить символы, такие как(), '* [] сформировать результаты grep с помощью grep, awk или sed?

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), 

, то, как СЭД 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.

+0

\ ваш друг –

+0

Если вы не манипулируя поля тоже sed, безусловно, был бы простым способом. 'sed -n '/ double/s/foo/bar/p' ' будет печатать все строки из '', содержащие 'double' с' foo', измененным на 'bar'. – Cascabel

+0

Обычно нет необходимости устанавливать разделитель полей в пространство, поскольку по умолчанию это включает. Вы можете сделать 'awk '{print $ 2, $ 1, $ 3, $ 8, $ 10}' плюс добавить другие вещи, такие как'/double/'и' gsub() '. –

ответ

1

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

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

или просто

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

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

+0

Что сказать, кроме СПАСИБО для экспертов! :) – easyyu

1

Ломая ответ ghostdog74'S:

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

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

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

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

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

+1

не нужно убегать, если вы это сделаете: 'gsub (" [] [(),] "," ")' – ghostdog74

1

С 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 выходе ФП в.

3

Если вы просто хотите лишить определенные символы, вы можете захотеть взглянуть на команде 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
[[email protected]~/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), 

[[email protected]~/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 
Смежные вопросы