2013-03-18 78 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