Как совместить две команды sed? - PullRequest
0 голосов
/ 09 октября 2018

Я читал об этом в Объединение двух команд sed , https://unix.stackexchange.com/questions/407937/combine-two-sed-commands, объединение двух команд sed и другие вопросы, но до сих пор не понимаю, какобъединить 2 команды sed.

Вот мой пример файла (file.txt).

    10/8/18
6:54:42.000 PM  
Oct  8 19:54:42 x.x.x.x 231 <134> 2018-10-08T18:54:42Z  Server_Name: 2018-10-08 18:54:42 - Server_Name - [127.0.0.1] System()[] - User Accounts modified. Removed username JohnDoe from authentication server RSA.

    host =  Server_Name 
    source =    /opt/x.x.x.x-20181008.log   
    sourcetype =    sslvpn  

    10/8/18
6:47:33.000 PM  
Oct  8 19:47:33 x.x.x.x 266 <134> 2018-10-08T18:47:33Z  Server_Name: 2018-10-08 18:47:33 - Server_Name - [y.y.y.y] JohnDoe - Closed connection to z.z.z.z after 6547 seconds, with 5526448 bytes read and 15634007 bytes written 

    host =  Server_Name 
    source =    /opt/x.x.x.x-20181008.log   
    sourcetype =    sslvpn  

    10/8/18
6:47:33.000 PM  
Oct  8 19:47:33 x.x.x.x 229 <134> 2018-10-08T18:47:33Z  Server_Name: 2018-10-08 18:47:33 - Server_Name - [y.y.y.y] JohnDoe - VPN Tunneling: Session ended for user with IPv4 address z.z.z.z

    host =  Server_Name 
    source =    /opt/x.x.x.x-20181008.log   
    sourcetype =    sslvpn  

    10/8/18
6:47:33.000 PM  
Oct  8 19:47:33 x.x.x.x 204 <134> 2018-10-08T18:47:33Z  Server_Name: 2018-10-08 18:47:33 - Server_Name - [y.y.y.y] JohnDoe - Logout from y.y.y.y (session:abc)

    host =  Server_Name 
    source =    /opt/x.x.x.x-20181008.log   
    sourcetype =    sslvpn  

Желаемый вывод

Oct  8 19:54:42 x.x.x.x 231 <134> 2018-10-08T18:54:42Z  Server_Name: 2018-10-08 18:54:42 - Server_Name - [127.0.0.1] System()[] - User Accounts modified. Removed username JohnDoe from authe
ntication server RSA.

Oct  8 19:47:33 x.x.x.x 266 <134> 2018-10-08T18:47:33Z  Server_Name: 2018-10-08 18:47:33 - Server_Name - [y.y.y.y] JohnDoe - Closed connection to z.z.z.z after 6547 seconds, with 5526448 by
tes read and 15634007 bytes written

Oct  8 19:47:33 x.x.x.x 229 <134> 2018-10-08T18:47:33Z  Server_Name: 2018-10-08 18:47:33 - Server_Name - [y.y.y.y] JohnDoe - VPN Tunneling: Session ended for user with IPv4 address z.z.z.z

Oct  8 19:47:33 x.x.x.x 204 <134> 2018-10-08T18:47:33Z  Server_Name: 2018-10-08 18:47:33 - Server_Name - [y.y.y.y] JohnDoe - Logout from y.y.y.y (session:abc)

То, что я сделал (2 команды sed) для получения вывода, было

sed -n '/[0-9]\/[0-9]\//,+1!p' file.txt > file2.txt
sed -n '/host =/,+3!p' file2.txt

Основываясь на ответе на другие вопросы, решением была точка с запятой, но я просто не уверен, как ее использовать,Вот моя попытка использовать точку с запятой, которая вообще не работала.

sed -n '/[0-9]\/[0-9]\//,+1!p;/host =/,+3!p' file.txt

Пожалуйста, сообщите

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы получили ответ на свой вопрос, но неправильно используете неправильный инструмент.Есть так много лучших способов сделать то, что вы хотите, чем указание 2 разных отрицательных условий (т.е. проверка того, что вы не хотите выводить, а не то, что вы делаете).Например:

grep -A 1 --no-group-separator '^[[:alpha:]]' file

awk '(NR%8) ~ /^[34]$/' file

awk '/^[[:alpha:]]/{c=2} c&&c--' file

или если вы действительно чувствуете жгучую необходимость использовать sed:

sed -n '/^[[:alpha:]]/,/^/p' file

В общем - избегайте негативной логики, потому что ее труднее понять (и обычно поддерживают), чемположительная логика и создает риск двойной отрицательной логики, которая является чрезвычайно запутанной и подверженной ошибкам.

0 голосов
/ 09 октября 2018

Почему бы не изменить ваш sed, чтобы он просто соответствовал шаблону и удалял, а не определял условия отрицания?просто удалите строки, используя оператор d

sed -e '/[0-9]\/[0-9]\//,+1d' -e '/host =/,+3d' file

Я бы поспорил, что флаг -n в вашей попытке может быть возможной причиной невозможности объединить две конструкции вместе.Потому что по определению флаг -n позволит sed печатать только те части, которые соответствуют , а не печатать все остальные строки.

...