我创建了一个 ping 扫描程序,将获取的 IP 保存到名为“hosts”的文件中。然后,我想从文件中删除我自己的 IP 地址,但不知道我的 IP 地址是什么,所以我尝试执行以下操作:
alias ownip='hostname -I'
sed ownip ./host
这不起作用,导致出现以下错误:
sed: -e expression #1, char 1: unknown command: `o'
那么如何从文件中删除我自己的IP呢?
答案1
如果输入的“主机”文件只是一个每行都是一个 IP 地址的文件,并且您想要删除hostname -I
该文件中输出的所有 IP 地址,请尝试以下操作:
sed -i "$(hostname -I | sed 's/\([.:[:xdigit:]]\{1,\}\)/\/\1\/d;/g')" ./host
主机名通过管道传输到的命令替换内部的 sed 只是将主机名输出的 IP 地址转换为外部 sed 的 sed 删除命令。 Sed 的i
标志告诉 sed 覆盖您提供的文件。您可能希望首先在没有此标志的情况下运行它,以确保输出正确,或者给出i
一个参数,告诉 sed 使用该参数作为后缀创建输入文件的备份,例如-i'~'
将生成一个名为 的备份host~
。如果您的 sed 版本没有此标志,您可以写入临时文件并覆盖原始文件:
sed "$(hostname -I | sed 's/\([.:[:xdigit:]]\{1,\}\)/\/\1\/d;/g')" ./host > /tmp/newhost && mv /tmp/newhost ./host
我认为i
无论如何,这就是幕后的作用。
如果您确实想使用别名,请注意别名只是当它们是第一个命令词时进行文本替换在命令中,因此在原始示例中,您需要使用命令替换,即 $(ownip) 来为 sed 提供实际执行该别名的输出。您的错误消息意味着 sed 正在尝试使用“ownip”作为其脚本,在这种情况下会抱怨,因为 sed 没有“o”命令。
答案2
我用 :
ip a | grep inet | awk '{print $2}'
如果您不想使用本地地址,请使用额外的grep -v 127
.
答案3
我会将您的别名稍微修改为trim
空格,然后ownip
也使用您的别名生成删除命令:
alias ownip='hostname -I | xargs'
sed -e "$(ownip | sed -e 's/[.]/[.]/g;s|.*|/&/d;|')" yourhostsfile