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",] 

ただし、sedssl.cipher.suites=にパラメータを追加すると、期待file.txtどおりに機能しませんでした。私はどこで間違っていますか?

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

関連情報