我使用此命令从文本文件中提取 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"