![Bash:如何将 CLI 输出的特定行存储到文件中?](https://linux22.com/image/139162/Bash%EF%BC%9A%E5%A6%82%E4%BD%95%E5%B0%86%20CLI%20%E8%BE%93%E5%87%BA%E7%9A%84%E7%89%B9%E5%AE%9A%E8%A1%8C%E5%AD%98%E5%82%A8%E5%88%B0%E6%96%87%E4%BB%B6%E4%B8%AD%EF%BC%9F.png)
假设在 CLI 中执行 bash 脚本后收到以下输出(因此该文本将显示在终端中):
POST https://mycompany.com/ COOKIE='BLABLABLABLABLA' HOST='ANYIPADDRESS' FINGERPRINT='sha256:BLABLABLABLA'
如何将 的内容(仅和
COOKIE
之间的文本)存储到单独的文件中?'
'
此外,上述文本应粘贴到该外部文件的特定位置。
已经存在的文件内容如下所示:
[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