bash - 在最后一行打印最后一个字段

标签 bash shell sed awk grep

所以有一个应用程序可以告诉我当前的 IP 是什么。输出不只是打印 IP,而是:

Starting GetIP process...
Getting your IP...
Your current IP: 127.0.0.1

有没有办法将 IP 保存到文件中?要么删除前两行和第三行的开头,要么只保存实际的数字和点。

我知道我可以使用 sed 修剪前两行,但如何删除第三行上的文本? (顺便说一句,预期输出只是 IP,没有冒号或空格)。

最佳答案

您可以使用 awk 轻松完成此操作:

$ your_command | awk 'END{print $NF}' 
127.0.0.1

要存储到文件,请使用重定向运算符:

$ your_command | awk 'END{print $NF}' > my_ip

awk 中,END block 在读取输入后执行,因此我们正在查看输入中的最后一行。 NF 是一个特殊的 awk 变量,它包含当前行上的字段数(本例中为 4),其中默认字段分隔符为空白。 $ 表示打印字段值,即 {print $1} 打印第一个字段值 $2 第二个等。


使用 sed 的一种方法:

$ your_command | sed -n '3s/.*: //p' 
127.0.0.1

# save to file
$ your_command | sed -n '3s/.*: //p' > my_ip

选项-n关闭每行的默认打印。 3 是我们要操作的行的地址(行号)。我们希望对 .* 之前的所有内容执行替换(s 命令),直到冒号后跟一个空格 : 并将其替换为空字符串。正斜杠是选定的分隔符,p 是打印命令,因此在替换发生后仅打印第三行。


使用 grep-o 选项,您可以打印给定 IP 匹配正则表达式的所有匹配项:

$ your_command | egrep -o '([0-9]{1,3}[.]){3}[0-9]{1,3}$'

# save to file
$ your_command | egrep -o '([0-9]{1,3}[.]){3}[0-9]{1,3}$' > my_ip

Linux 上的最佳解决方案是使用主机名:

$ hostname -I
127.0.0.1

# save to file
$ hostname -I > my_ip

但是,这不可移植,因为 OSX 版本的 hostname 命令可以使用 -I 选项。

关于bash - 在最后一行打印最后一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033730/

相关文章:

git - 在 cygwin 中使用带有 xargs 的子字符串

linux - 从随机文件列表创建菜单的 bash 脚本

shell - Unix tar : do not preserve full pathnames

linux - 读取文件中的第一行并将其附加到搜索字符串的第一次出现处并重复直到 EOF

bash - Kubernetes 就绪性探测失败

bash - 在 'source' 的 Dockerfile 中使用 RUN 指令不起作用

git - 放弃 git 分支上所有更改(带有未跟踪文件)的最佳方法是什么?

linux - 使用 Awk 根据 csv 文件中的分隔符将一列拆分为两列?

linux - 如何在 linux 中每第 n 行对数据进行排序?

python - 如何让 bash 脚本从 python 脚本获取输入