2013-06-27 4 views
1

У меня есть файл с множеством журналов вызовов, и я пытаюсь его очистить с помощью bash. Я понял, как искать строку и удалять всю строку, на которой она находится, но это не то, что я хочу выполнить.удалять строки из файла bash

Я хочу, чтобы найти строку в качестве примера:

  • Есть тонны MAC-адреса в файле, и я хочу, чтобы удалить их все MAC:00-0A-DD-84-01-33
  • Существует также идентификатор вызова в начале каждой строки, которая выглядит так: 354469805 или 354469894, и я хочу удалить все эти.

Я только начинаю в bash, поэтому, пожалуйста, извините мое невежество. Я вхожу в 2 строки журнала вызовов ниже для уточнения. Я хочу удалить номер 3544, MAC-адрес и слово Telepacific.

354469725 06/24/2013 09:34 00:03:26 Chante Squires  105 TelePacific  MAC:00-0A-DD-84-01-1D TelePacific     17025290701 1 
354469732 06/24/2013 09:59 00:01:16 Chante Squires  105 TelePacific  MAC:00-0A-DD-84-01-1D TelePacific     12132238375 1 
+0

Пожалуйста, добавьте несколько образцов строк ввода вопроса. –

+1

'sed -i '/ regex-pattern/d' file.ext' – Wrikken

+0

Я попробовал sed -i '/" Telepacific "/ d' Nichole24-25> Nichole но получил .. sed: 1:" Nichole24-25 ": дополнительные символы в конце команды N – Fr0ntSight

ответ

1

Вы можете использовать sed:

sed -i 's/^[0-9]\{9\}\|MAC:[0-9A-Fa-f]\{2\}\([-\:][0-9A-Fa-f]\{2\}\)\{5\}//g' input.log 

Между в 's/ и //g' является регулярным выражением, которое соответствует критериям удаления в вашем вопросе. Флаг s спереди означает «поиск и замена» регулярного выражения. Значение // означает замену регулярного выражения ничем. Флаг g в конце означает «заменить все соответствия», если они встречаются более одного раза в строке. Наконец, переключатель -i означает «редактировать файлы на месте».

Это решение предполагает, что ваши идентификаторы вызовов являются 9 цифрами и что MAC-адрес имеет шесть групп из двух шестнадцатеричных цифр, разделенных тире или двоеточиями.

1

Один из способов с awk (вы потеряете дополнительные вкладки пространства, каждое поле будут разделены одним пробелом):

awk '{for(i=2;i<NF;i++) if(8>i || i>10) printf "%s ", $i; print $NF}' log