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



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

(:
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'); 

是否有一个尴尬的衬里来做到这一点,或者我应该寻求"sed"的帮助?

您可以使用此 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添加到命令行。

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

最新更新