Bash:CLI出力の特定の行をファイルに保存する方法は?

Bash:CLI出力の特定の行をファイルに保存する方法は?
  1. CLIでbashスクリプトを実行した後、次の出力を受け取ったとします(このテキストは端末に表示されます)。

    POST https://mycompany.com/
    COOKIE='BLABLABLABLABLA'
    HOST='ANYIPADDRESS'
    FINGERPRINT='sha256:BLABLABLABLA'
    

    コンテンツ(COOKIEとの間のテキストのみ)を別々のファイルに保存するには?''


  1. また、上記のテキストをその外部ファイルの特定の場所に貼り付ける必要があります。

    既存のファイルの内容は次のとおりです。

    [global]
    Name = Name of VPN connection
    
    [provider_openconnect]
    Type = OpenConnect
    Name = Name of VPN connection
    Host = IP-address
    Domain = Domain name
    OpenConnect.Cookie = >>>INSERT CONTENT OF THE COOKIE HERE<<<
    OpenConnect.ServerCert = sha256:BLABLABLABLA
    

    どうやってこれができますか?

答え1

これらのタイプのものは本質的に普遍的ではありませんが、方法はありますが、


私はあなたがOpenConnect.Cookie =次の行を変更したいと思います。OpenConnect.Cookie = BLABLABLABLABLA

したがって、最初に必要な文字列を生成するために使用できます

sed -i  "s/^OpenConnect.Cookie =.*$/$( command_giving_output  | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /")/" external_filename

ここでは、まず必要な文字列を生成するためにコマンド置換を使用しています。

command_giving_output  | grep 'COOKIE=' | sed "s/COOKIE='//; s/'//g; s/^/OpenConnect.Cookie = /"

次に、目的の行を目的の文字列に置き換えます。

sed -i  "s/^OpenConnect.Cookie =.*$/output from above command substitution /" external_filename

答え2

あなたが使用できる:

. <(command | grep "^COOKIE=")
sed -i "s/\(OpenConnect.Cookie\)\s*=.*/\1 = ""$COOKIE""/" file

どこ:

  • file質問に記載されている内容を含む既存のファイル。
  • command端末にテキストを印刷するコマンドです。
  • grep "^COOKIE="次に始まる行の検索COOKIE=
  • コマンドの先頭のポイントは出力を「ソース」します。これは、出力がシェルコードとして解釈されることを意味します。したがって、変数は$COOKIE現在のシェルに設定されます。
  • その後、コマンドはsedターゲットファイルの行を変数の内容で置き換えます$COOKIE

答え3

どうですか?

sed -f <(CLI command | sed -n '/COOKIE=\o047/{s//\/OpenConnect.Cookie =\/ s\/= \.*$\/= /; s/.$/\//p;}') file
[global]
Name = Name of VPN connection

[provider_openconnect]
Type = OpenConnect
Name = Name of VPN connection
Host = IP-address
Domain = Domain name
OpenConnect.Cookie = BLABLABLABLABLA
OpenConnect.ServerCert = sha256:BLABLABLABLA

sedCLIコマンドはそのデータを抽出/処理して「スクリプトファイル」を動的に生成し、2番目の呼び出しsedでは「プロセス置換」を使用してスクリプトファイルを実行します。

答え4

この回答は以下に基づいています。@MSaltersのコメント。使用されるシェルはBashです。

prompt% COOKIE=$(./mycmd | grep -Po "(?<=COOKIE=)'[[:alnum:]]+'" | tr -d \')
prompt% echo "$COOKIE" >/tmp/cookie
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file

代替ソリューション(GNUを使用expr

このソリューションは、一致する結果が1つしかない場合に機能します。

prompt% COOKIE=$(expr "$(./mycmd | grep COOKIE)" : "COOKIE='\([[:alnum:]]\+\)'[[:space:]]*")
prompt% echo "$COOKIE" >/tmp/file
prompt% sed -i "s:\(OpenConnect.Cookie =\).*:\1 $COOKIE:" file

関連情報