我有一个返回以下文本的文件:
10.10.10.160:1111
10.10.10.170:2222
10.10.10.180:3333
grep -m 1 -o '.*' filename | cut -d ':' -f
我尝试了上述操作,但只能得到一行输出。
10.10.10.160
但是当我尝试
grep -m 2 -o '.*' filename | cut -d ':' -f
10.10.10.160
10.10.10.170
我明白以上内容。
如果我只想得到第二行
10.10.10.170
有什么办法吗?
答案1
head -2 filename | tail -1 | cut -d ':' -f 1
答案2
我建议使用 awk 来完成这类任务:
awk -F: 'NR==2 {print $1}' filename
或者使用 sed:
sed -n '2s/:.*//p' filename
如果文件是大的,你可能想把它们改成
awk -F: 'NR==2 {print $1; exit}' filename
和
sed -n '2{s/:.*//p;q;}' filename
以避免不必要地处理后面的行。
答案3
grep -m 2 -o '.*' filename | cut -d ':' -f 1 | tail -n 1
结果:
10.10.10.170
tail -n 1
仅打印结果的最后一行grep -m 2 -o '.*' filename | cut -d ':' -f 1
原始文本文件名为filename。
答案4
您可以纯粹使用 shell(假设是 bash)来完成此操作,而无需使用任何其他实用程序:
{
read
IFS=: read ip port
echo $ip
} < input.txt
从末尾开始, 重定向<
到input.txt
命令{ }
组。然后,第一个命令read
读取 1 行并将其丢弃。第二个命令read
读取下一行,并IFS
用冒号 分隔:
。第二个命令用第二行的第 1 个和第 2 个元素read
填充ip
和port
变量。$ip
变量是 的输出echo
。