我有一个结构如下的文件:
[IP ADRESS], [ID-Number], [Name]
[IP ADRESS], [ID-Number], [Name]
[IP ADRESS], [ID-Number], [Name]
...
(括号内为实际值)
如何在循环遍历行时获取(打印)特定值(IP 地址、ID 或名称)(最好使用“sed”,因为我已经开始研究这一点)?
我的目标是通过使用脚本获取 IP 地址来向每个服务器发送 SSH 命令,然后获取另一个程序的 ID 号和名称,该程序显示每个命令的输出与名称的组合(我正在尝试构建我们的服务器的监控服务)。所以我只需要能够获取其中的一两个值。
答案1
awk
可能是这项工作最直接的工具。
从示例输入文件(称为foo
)中可以看出,除了一行中的最后一个字段之外,每个字段都有一个逗号,后面有一个空格。
因此,要打印每行的 IP 地址,请使用:
$ awk -F', ' '{print $1}' < foo
要打印每行的 ID 号,请使用:
$ awk -F', ' '{print $2}' < foo
要打印每行的名称,请使用:
$ awk -F', ' '{print $3}' < foo
还可以制作一个单独的awk
语句来创建组合各种输入字段的输出:
$ awk -F', ' '{print "ssh " $1 " /path/to/myscript.sh " $2 " " $3}' < foo
一旦您检查了该语句的输出以确保它对于您的目的来说是准确且有效的,您可以通过将其传输到 shell 来轻松执行它:
$ awk -F', ' '{print "ssh " $1 " /path/to/myscript.sh " $2 " " $3}' < foo | bash
答案2
根据您最近的更新添加答案(通过 SSH 连接到每台服务器,并运行一个或多个使用 ID 和名称值的命令)。
从这样的示例文件开始:
$ cat testfile.txt
192.168.56.1,12345,N1
192.168.56.2,23456,N2
192.168.56.3,34567,N3
一个while
循环read
可以完成这项工作:
while IFS=, read -r IP ID NAME; do
echo "ssh $IP myprogram $ID $NAME"
done < testfile.txt
输出结果如下:
ssh 192.168.56.1 myprogram 12345 N1
ssh 192.168.56.2 myprogram 23456 N2
ssh 192.168.56.3 myprogram 34567 N3
该循环按以下方式工作。从输入文件中,依次读取每一行。在每一行上,内容根据特殊变量分为不同的字段IFS
。通过设置,IFS=,
您可以在每次出现“,”字符时分割行。这将导致每行被分成三个字段。
完成后,每个字段都会分配给相应的变量IP
, ID
& NAME
。您可以在循环体内使用这些变量。作为一个例子,我只是打印出ssh
每行可能的命令。
请注意,我用作示例的 CSV 文件是一个简单的文件。如果您有更复杂的 CSV 文件,则需要考虑使用适当的 CSV 解析器,例如csvkit
.
答案3
使用米勒(https://github.com/johnkerl/miller/releases/tag/5.4.0), 从...开始
169.38.84.49,8695458,Malcolm
23.246.195.8,7589632,Jerry
119.81.134.226,4571286,Basil
如果您想要第二个字段等于 7589632 的行
mlr --nidx --fs "," filter -S '$2=="7589632"' input.csv
如果您只想要第二个字段等于 7589632 的行的第一列
mlr --nidx --fs "," filter -S '$2=="7589632"' then cut -f 1 input.csv
答案4
我喜欢 Haxiel 的解决方案并添加一些内容......
while IFS=, read -r IP ID NAME; do
echo "ssh $IP myprogram $ID $NAME"
done << ENDEND
192.168.56.1,12345,N1
192.168.56.2,23456,N2
192.168.56.3,34567,N3
ENDEND