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指表