无法将 sed 或 awk 命令的输出分配给变量?只能打印它们



我使用此命令从文本文件中提取 2 行:

cat file1 | grep -A7 SECTIONA  | grep -E 'Address|BackupAddress'

这将产生以下两行:

Address host1  port_1  Address
BackupAddress host2 port_2  BackupAddress

我需要将主机和端口列分配给(而不是打印(不同的全局变量,以便稍后在脚本中使用。

hosta="host1"
porta="port_1"
hostb="host2"
portb="port_2"

一位成员建议我使用它并获得所需的输出,但是我无法使用当前 shell 中的变量?当我尝试打印或使用它们时,它们会变成空白。我还有一个awk解决方案来获得所需的输出,但是sed和awk命令都只是打印上述内容而不创建变量?

sed -n 's/^Address *([^ ]+) *([^ ]+).*/hosta="1"nporta="2"/p;
s/^BackupAddress *([^ ]+) *([^ ]+).*/hostb="1"nportb="2"/p' file1

我可以通过将 sed 和 awk 命令分成 4 个部分并运行相同的查询 4 次来解决所有这些问题,但必须有更好的方法。 例如,我可以做:

hosta=`cat file | sed/or/awk command` 
porta=`cat file | sed/or/awk command` 
hostb=`cat file | sed/or/awk command` 
portb=`cat file | sed/or/awk command` 

当我使用 awk 或 sed 命令进行查询以获得所需的输出时,它们会被分配给变量,我可以根据需要打印或使用变量; 但我不想运行查询 4 次。

任何人都可以帮忙吗

检查输入不包含无效字符,输出的来源可以与"eval"ed相同。 在这种情况下,负字符集[^ ]应替换为正字符集以匹配预期字符

output=$(sed ...)
eval "$output"

eval "$(sed ...)"

source <(sed ...)

这种情况一直都是如此。主机地址和端口行为 跨所有文件的通用...

。所以有两行我 grep 从文件中取出,它们将始终包含 4 个变量

鉴于应用程序的特殊性,您可以:

  • 扫描文件一次
  • 将结果保存到变量中
  • 仅解析变量以分配主机和端口变量

给定输入文件输入.txt,其中包含:

地址主机1 port_1地址备份地址主机2 port_2 备份地址

您可以使用此脚本:

#!/bin/bash
lines="$(grep -P "Address|BackupAddress" <input.txt)"             #Get the two lines needed
hosta="$(awk '/^Address/ { print $2 }' <<<"${lines[@]}")"         #Assign $hosta
porta="$(awk '/^Address/ { print $3 }' <<<"${lines[@]}")"         #Assign $porta
hostb="$(awk '/^BackupAddress/ { print $2 }' <<<"${lines[@]}")"   #Assign $hostb
portb="$(awk '/^BackupAddress/ { print $3 }' <<<"${lines[@]}")"   #Assign $portb
#Use the results how you like.  Here we just echo them back:
echo "$hosta"
echo "$porta"
echo "$hostb"
echo "$portb"

相关内容

  • 没有找到相关文章

最新更新