如何grep字符串的行号,在其他文件中复制同一行

时间:2018-10-22 11:16:14

标签: linux shell awk sed grep

我在这里使用awk而不是grep。文件pkg.conf具有'ssl_cipher'字符串,我需要将包含ssl_cipher的行复制到另一个文件'pkg.conf.new',且行号相同(此处为pkg.conf中的20):

PHP >= 7.1.3
OpenSSL PHP Extension
PDO PHP Extension
Mbstring PHP Extension
Tokenizer PHP Extension
XML PHP Extension
Ctype PHP Extension
JSON PHP Extension

是不是只有一个班轮来做这件事,还是应该寻求“ sed”的帮助?

2 个答案:

答案 0 :(得分:2)

您可以使用以下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

答案 1 :(得分:0)

您可以使用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则用于删除,以删除该行的原始内容。