使用 sed 命令读取给定文件中的各部分

使用 sed 命令读取给定文件中的各部分

文件内容。

[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.txtsed 后并没有按预期工作。我哪里出错了?

答案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

相关内容