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

因此,要首先创建所需的 string ,您可以使用

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=
  • 命令开头的点“来源”输出。这意味着输出被解释为 shell 代码。因此该变量$COOKIE是在当前 shell 中设置的。
  • 然后该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

sed通过从 CLI 命令中提取/处理相关数据来动态创建一个“脚本文件”,并在第二次sed调用中使用“进程替换”执行该脚本文件。

答案4

这个答案是基于@MSalters的评论。使用的 shell 是 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

如果只有一个匹配结果,则此解决方案有效。

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

相关内容