web-dev-qa-db-ja.com

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
    

    そんなことがあるものか?

7
Dave

これらのタイプのものは本質的にジェネリックではありませんが、アプローチはジェネリックですが具体的です


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
3
mkmayank

Bashの読み取りとgrepの組み合わせを使用してCookieを読み取ることができます。

IFS="'" read -r _ cookie _ < <(some-command | grep '^COOKIE')

これは、プロセス置換を使用して、some-command | grep '^COOKIE')の出力をreadにフィードします。 IFS="='"を使用して、'で入力を分割し、分割の最初の要素(COOKIE=)(および終了引用符の後の残りのテキスト)を破棄し、2番目の要素をcookieに保存します。変数。

次に、sedを使用してテキストを置き換えることができます。

sed -i 's/>>>INSERT CONTENT OF THE COOKIE HERE<<</'"$cookie"'/' some-file

ただし、これは&のような特殊文字を含まないCookieテキストに依存します。

3
muru

あなたは使うことができます:

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

どこ:

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

いかがですか

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

CLIコマンドから関連データを抽出/マッサージすることでその場で「sedスクリプトファイル」を作成し、2回目のsed呼び出しで「プロセス置換」を使用してこのスクリプトファイルを実行します。

2
RudiC

この回答は @ 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
1
Fólkvangr