Shell 在unix中循环浏览和修改列表

Shell 在unix中循环浏览和修改列表,shell,unix,for-loop,sed,cat,Shell,Unix,For Loop,Sed,Cat,我试图获取列表list1的内容,并将它们与finger生成的另一个列表进行循环比较。当在finger中找到list1中的名称时,应将其从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 以美元表示的i的(目录1);做 如果finger | grep$i

我试图获取列表
list1
的内容,并将它们与
finger
生成的另一个列表进行循环比较。当在
finger
中找到
list1
中的名称时,应将其从
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
以美元表示的i的
(目录1);做
如果finger | grep$i
echo“$i在线”
sed'/$i/d'圣殿骑士
mv圣殿骑士列表1
fi
完成
list1
不会更改。脚本运行后,
list1
的内容相同。 我认为问题与开始时的
cat
有关,但我不确定

谢谢, Ryan

试试双引号:

sed "/$i/d" <list1 >templist
sed”/$i/d“圣殿骑士

(列表中实际上没有任何
$i

如果
列表1
不是很大(最多几百个项目),您可以这样做:

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

工作原理:
paste
将列表转换为管道分隔的列表,该列表使用
$(…)
构造内联到命令中,由egrep解释为regexp,并使用
-v
标志进行否定,以仅包括不匹配的行。

根本不需要循环:

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

comm-23保持你原作的精神,我可能会按照这些思路重写它,以避免重复的手指和对列表的重复

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
finger>fingerlist
边读边读;做
如果grep“$aline”fingerlist>/dev/null;然后
echo“$aline在线”
其他的
echo“$aline”>圣堂武士
fi
完成<列表1
[-s圣堂武士]&&mv-f圣堂武士列表1
rm指表