hen*_*kay 7 command-line text-processing
我有一个返回以下文本的文件:
10.10.10.160:1111
10.10.10.170:2222
10.10.10.180:3333
Run Code Online (Sandbox Code Playgroud)
grep -m 1 -o '.*' filename | cut -d ':' -f
Run Code Online (Sandbox Code Playgroud)
我尝试了上面的方法,我只能得到 1 行输出。
10.10.10.160
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用
grep -m 2 -o '.*' filename | cut -d ':' -f
Run Code Online (Sandbox Code Playgroud)
10.10.10.160
10.10.10.170
Run Code Online (Sandbox Code Playgroud)
我明白了上面的内容。
如果我只想得到第二行
10.10.10.170
Run Code Online (Sandbox Code Playgroud)
有什么办法吗?
ste*_*ver 17
我建议 awk 用于此类任务:
awk -F: 'NR==2 {print $1}' filename
Run Code Online (Sandbox Code Playgroud)
或者使用 sed:
sed -n '2s/:.*//p' filename
Run Code Online (Sandbox Code Playgroud)
如果文件很大,您可能需要将它们更改为
awk -F: 'NR==2 {print $1; exit}' filename
Run Code Online (Sandbox Code Playgroud)
和
sed -n '2{s/:.*//p;q;}' filename
Run Code Online (Sandbox Code Playgroud)
以避免不必要地处理后面的行。
grep -m 2 -o '.*' filename | cut -d ':' -f 1 | tail -n 1
Run Code Online (Sandbox Code Playgroud)
结果:
10.10.10.170
Run Code Online (Sandbox Code Playgroud)
tail -n 1 只打印结果的最后一行 grep -m 2 -o '.*' filename | cut -d ':' -f 1
原始文本文件名为 filename。
你可以使用这个sed命令:
sed -e '2!d' -e 's/:.*//' filename
Run Code Online (Sandbox Code Playgroud)
或者,以更紧凑的方式:
sed '{2!d; s/:.*//; q;}' filename
Run Code Online (Sandbox Code Playgroud)
2!d告诉sed删除 ( d) 除 ( !) 第二 ( 2) 行之外的所有行。's/:.*//'告诉sed删除之后的所有内容:(包括:)。q,用于在操作完成后立即终止操作(对于较大的文件很有用 - 感谢 @JoL 的建议)。