2013-03-18 45 views
1

我试图将列表list1的内容循环,并将它们与由finger生成的另一个列表进行比较。如果在finger中找到list1的名称,则应从list1中删除该名称。在unix中循环并修改列表

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有关,但我不确定。

感谢, 瑞安

回答

1

尝试双引号:(没有实际列表中的任何$i

sed "/$i/d" <list1 >templist 

0

如果list1不是大规模的(比如,最多几百件),你可以这样做:

finger | egrep -v "$(paste -sd'|' list1)" > templist && mv templist list1 

工作原理:paste将列表变成管道分隔列表,该列表使用$(...)构造内联到命令中,由egrep解释为正则表达式,并且与-v标志取反以仅包含不匹配的行。

1

不需要循环都:

comm -23 <(sort list1) <(finger | sort) > tmpfile && 
mv list1 list1.bak && 
mv tmpfile list1 

comm -23 file1 file2返回文件1没有出现在文件2行。 file1和file2必须被排序。

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