这个逻辑怎么用 bash 实现

2014-03-07 10:38:36 +08:00
 webjin
我的需求是 有2个文件,求 1.txt和ip.txt不同的内容。
ip.txt文件内容是
192.168.0.1
192.168.0.2
....
....
192.168.0.255
就是1-255的IP
而1.txt 是随机的一些ip是我在交换机ARP表里面获取到的
192.168.0.9
192.168.0.11
192.168.0.14
192.168.0.126
192.168.0.18
等差不多有50个吧
现在我要整理哪些IP没在用。就写了一个bash脚本来处理
但是运行这个脚本没报错。但是ip.txt的内容变空了,按照我的逻辑思路,ip.txt已经是把1.txt的相同内容过滤掉了。
#!/usr/bin/env bash
for ip in $(cat 1.txt)
do
grep -v "$ip" ip.txt > ip.txt
done
5599 次点击
所在节点    Linux
38 条回复
wwwjfy
2014-03-07 10:48:22 +08:00
grep ... ip.txt | sponge ip.txt
jakwings
2014-03-07 10:52:30 +08:00
上面 wwwjfy 才是对的……不要胡乱猜测工具在输出内容前会不会为你缓存整个文本的内容,因为工具为了资源消耗的考虑可能不会如你所愿。
webjin
2014-03-07 11:02:14 +08:00
@jakwings 包错 ./ip.sh: line 4: sponge: command not found 是不是sponge是一个单独的工具,要安装的?
jakwings
2014-03-07 11:08:19 +08:00
@webjin 明显是的。要省事的话直接弄一个临时文件更快。
7rack
2014-03-07 11:10:36 +08:00
你的代码乍一看没错,其实是你在同一管道中读写同一文件,这里是问题。所以你可以改为
grep -v "$ip" ip.txt > iptmp.txt
mv iptmp.txt ip.txt
试试
Mutoo
2014-03-07 11:40:16 +08:00
sort 完 diff 不就行了?
duzhe0
2014-03-07 11:46:38 +08:00
sort 1.txt > using.txt
sort ip.txt > all.txt
comm -13 1.txt ip.txt > unused.txt
duzhe0
2014-03-07 11:47:16 +08:00
错了,最后一行应该是
comm -13 using.txt all.txt > unused.txt
kfll
2014-03-07 12:07:11 +08:00
grep -E -v "($(echo -n $(< 1.txt) | tr '[[:blank:]]*' '|'))" ip.txt
webjin
2014-03-07 12:22:12 +08:00
@7rack 谢谢了,同一管道中读写同一文件 。是我这个问题困扰我很久,为什么想不通,他grep输出来的内容然后再重定向到他本身文件会清空,如果是>>他会添加但是> 他直接清空。
webjin
2014-03-07 12:23:36 +08:00
@duzhe0 comm 这个命令很少用。我去了解他下的功能。
webjin
2014-03-07 12:25:41 +08:00
@kfll 谢谢你的回答 ,你正则表达式用的很熟练。但是我不明白里面的含义。
webjin
2014-03-07 12:27:55 +08:00
@duzhe0 非得先排序然后再来comm吗?
webjin
2014-03-07 12:30:40 +08:00
@duzhe0 我实验了一下,但是我发行他最后重新输出了内容就不是排好序的,是打乱了顺序。
winsweet
2014-03-07 12:37:33 +08:00
cat 1.txt ip.txt ip.txt | sort | uniq -u
webjin
2014-03-07 12:44:44 +08:00
其实这种方法也可以吧
#!/usr/bin/env bash
for ip in $(cat 1.txt)
do
grep -v "$ip" ip.txt | tee ip.txt
done
webjin
2014-03-07 12:54:25 +08:00
我要纠正下我刚才实验了一下 grep -v "$ip" ip.txt | tee ip.txt
这个方法不行,因为我对比了 1.txt和ip.txt文件 最后输出的结果不一样,他多处理很多IP 。结果不正确。
webjin
2014-03-07 12:55:17 +08:00
@winsweet 嗯 我怎么没想到 uniq呢? 这算是最简单的了。
amyangfei
2014-03-07 12:58:57 +08:00
http://stackoverflow.com/questions/4780203/deleting-lines-from-one-file-which-are-in-another-file
这个链接有一些讨论还有一个简单的性能比较
grep -v -x -f 1.txt ip.txt 用这种方法貌似会多一些结果,不清楚为什么
webjin
2014-03-07 13:01:08 +08:00
@7rack 我发现 他跟 grep -v "$ip" ip.txt | tee ip.txt 输出的结果不正确,会多删掉 1.txt里面没有的内容。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/103231

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX