Как получить номер строки строки, скопировать ту же строку в другой файл - PullRequest
0 голосов
/ 22 октября 2018

Вместо grep я использовал здесь awk.Файл pkg.conf содержит строку 'ssl_cipher', мне нужно скопировать строку, содержащую ssl_cipher, в другой файл 'pkg.conf.new' с тем же номером строки (здесь это 20 в pkg.conf):

bash-4.2$ awk '/ssl_cipher/ {print FNR,$(NF-1),$NF}' pkg.conf
20 ssl_cipher 'ECDHJES128:ECDH+AESGCM:ECDH+AES256:DH+AES:DH+AESGCM:DH+AES256:RSA+AES :RSA+AESGCMHaNULL:!RC4:!MD5:!DSS:!3DESHSSLv3'); 

Есть ли один лайк на awk для этого или я должен обратиться за помощью к sed?

Ответы [ 2 ]

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

Вы можете использовать sed для генерации сценария sed:

awk '/ssl_cipher/ {print FNR,$(NF-1),$NF}' pkg.conf \
| sed 's/ /{i/;s/$/\nd}/' \
| sed -f- pkg.conf.new

Первый скрипт sed преобразует вывод в

20{issl_cipher 'ECDHJES128:ECDH+AESGCM:ECDH+AES256:DH+AES:DH+AESGCM:DH+AES256:RSA+AES :RSA+AESGCMHaNULL:!RC4:!MD5:!DSS:!3DESHSSLv3');
d}

, который говорит sed обрабатывать строку 20 специально: i для вставка и d для удаления, которое удаляет исходное содержимое строки.

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

Вы можете использовать этот скрипт awk:

awk 'NR==FNR{               # On the first file
       if(/ssl_cipher/){    # lookup the string
         line_content=$0;   # store the content
         line_no=NR         # and line number
       };
       next                 # skip other files
     }
     FNR==line_no{          # On the second file, at the wanted line 
       print line_content   # append the wanted content
     }1                     # print the other lines
     ' pkg.conf pkg-new.conf

Обратите внимание, что будет вставлена ​​новая строка.Как упомянуто @Yoric, если вы хотите заменить строку и ключевое слово next после print line_content.

Результат выводится на стандартный вывод.Если вы хотите заменить файл pkg-new.conf, и если у вас есть GNU awk, вы можете добавить опцию -i inplace в командную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...