循环并修改unix中的列表

时间:2013-03-18 18:19:35

标签: shell unix for-loop sed cat

我正在尝试获取列表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有关,但我不确定。

谢谢, 莱恩

4 个答案:

答案 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