我正在尝试获取列表list1
的内容并循环浏览它们,将它们与finger
生成的另一个列表进行比较。如果在list1
中找到finger
的名称,则应将其从list1
中删除。
for i in $(cat list1); do
if finger | grep $i
echo "$i is online"
sed '/$i/d' <list1 >templist
mv templist list1
fi
done
list1
不会改变。脚本运行后,list1
的内容相同。
我认为问题与开头的cat
有关,但我不确定。
谢谢, 莱恩
答案 0 :(得分:1)
尝试双引号:
sed "/$i/d" <list1 >templist
(列表中实际上没有$i
。)
答案 1 :(得分:1)
根本不需要循环:
comm -23 <(sort list1) <(finger | sort) > tmpfile &&
mv list1 list1.bak &&
mv tmpfile list1
comm -23 file1 file2
返回file1中未出现在file2中的行。必须对file1和file2进行排序。
答案 2 :(得分:0)
如果list1
不是很大(例如,最多只有几百个项目),你可以这样做:
finger | egrep -v "$(paste -sd'|' list1)" > templist && mv templist list1
如何工作:paste
将列表转换为以管道分隔的列表,使用$(...)
构造将其内联到命令中,由egrep解释为正则表达式,并使用{{ 1}}标志仅包含不匹配的行。
答案 3 :(得分:0)
坚持原作的精神,我可能会沿着这些方向重写它,以避免重复的手指和其他事物的清单。
finger > fingerlist
while read aline ; do
if grep "$aline" fingerlist > /dev/null ; then
echo "$aline is online"
else
echo "$aline" > templist
fi
done < list1
[ -s templist ] && mv -f templist list1
rm fingerlist