![使用 sed 命令读取给定文件中的各部分](https://linux22.com/image/151491/%E4%BD%BF%E7%94%A8%20sed%20%E5%91%BD%E4%BB%A4%E8%AF%BB%E5%8F%96%E7%BB%99%E5%AE%9A%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%90%84%E9%83%A8%E5%88%86.png)
文件内容。
[kafka_properties]
listeners=PLAINTEXT://:KAFKA_CLIENT_PORT
default.replication.factor=2
ssl.client.auth=required
ssl.cipher.suites=["TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",]
ssl.enabled.protocols=TLSV1.2
ssl.secure.random.implem=SHA1PRNG
security.inter.broker.protocol=PLAINTEXT
security.protocol=SSL
ssl.endpoint.identification.algorithm=https
[kafka_ports]
KAFKA_CLIENT_PORT=9082
[zookeeper_properties]
clientPort=ZK_CLIENT_PORT
syncLimit=2
initLimit=5
tickTime=2000
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
admin.serverPort=ZK_SERVER_ADMIN_PORT
我正在尝试读取每个部分的值,例如[kafka_properties]
,或[kafka_ports]
使用以下命令:
cat file.txt | sed -n '0,/kafka_properties/d;/\[/,$d;/^$/d;p'
并将这些值写入不同的文件中。如果我不添加参数,它工作正常:
ssl.cipher.suites=["TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",]
但是将ssl.cipher.suites=
参数添加到file.txt
sed 后并没有按预期工作。我哪里出错了?
答案1
[
仅在行首匹配^
:
sed -n '0,/kafka_properties/d;/^\[/,$d;/^$/d;p' file.txt
答案2
对于一般情况,将每个部分写入不同的文件而不需要知道部分名称,您可以这样做:
awk '/^\[/{n=$1;gsub(/[][]/,"",n)}{print >> n".txt"}' file
这将从您的示例创建这些文件:
kafka_ports.txt kakfa_properties.txt zookeeper_properties.txt
解释
/^\[/{n=$1;gsub(/[][]/,"",n)}
:如果此行以 开头[
,则将第一个字段保存为变量n
并从中删除所有[
或。]
print >> n".txt"
:将当前行追加到文件中n.txt
,其中n
是节的名称。
请注意,这假设节名称中从来没有空格。如果您这样做,请尝试以下操作:
awk '/^\[/{n=$0;gsub(/[][]/,"",n); gsub(/ /,"_",n)}{print >> n".txt"}' file