1

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

4 に答える 4

1

二重引用符を試してください:

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

$i(実際にはリストにはありません。)

于 2013-03-18T18:28:58.703 に答える
1

ループする必要はまったくありません。

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

comm -23 file1 file2file2に表示されないfile1の行を返します。file1とfile2をソートする必要があります。

于 2013-03-18T18:54:28.947 に答える
0

大きくない場合list1(たとえば、最大で数百のアイテム)、次のように実行できます。

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

仕組み:pasteリストをパイプで区切られたリストに変換します。このリストは、$(...)構成を使用してコマンドにインライン化され、egrepによって正規表現として解釈され、-v一致しない行のみを含めるようにフラグで否定されます。

于 2013-03-18T18:29:58.187 に答える
0

あなたのオリジナルの精神を保ちながら、私はおそらくこれらの線に沿ってそれを書き直して、とりわけリストの繰り返しの指とsed-ingを避けるでしょう。

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
于 2013-03-18T18:54:40.270 に答える