2013-08-06 61 views
1

需要您使用脚本删除具有“for”命令行的帮助。删除列表中的行

file1 - contains list of servers 
dog 
cat 
eel 
ape 

,然后做一些事情(平为例)与每一个单列 但每次它会从列表中的第一线时间...

这是我做的,但它dosnt工作做好

#!/bin/ksh -x 
for server in `cat file1` 
do 
ping $server 
sed '1d' file1 
done 

在脚本末尾,file1应该是空的。 感谢

阿萨夫

+0

1.杀死'cat',用'read'代替。 2.'sed'不会改变输入文件,它会写入标准输出。 – cdarke

回答

2

您也可以在每次读取时删除一行。有了这个,如果脚本被中断,“$ FILE”中剩下的只有那些尚未处理的文件。

FILE=<filename> 
while read SERVER < "$FILE"; do 
    sed -i 1d "$FILE" 
    ping "$SERVER" 
done 
0

如果它应该是在循环之后空结尾,空吧:

for server in `cat file1` 
do 
ping $server 
done 
echo '' > file 

否则,加-i来的sed编辑源文件:

for server in `cat file1` 
do 
ping $server 
sed -i '1d' file1 
done 
+0

嗨, 感谢您的快速回复。 你有一个exple如何做到这一点阅读? 它假设与循环。 –

1

sed不改变输入文件,它只改变其模式缓冲器,其被写入stdout(默认)。您无法使用sed编辑文件。我宁愿这样:

while read server 
do 
    ping "$server" 
done < file1 

# empty the file 
> file1 

但如果你真的必须保留在文件中的步骤,然后:

while read server < file1 
do 
    ping "$server" 
    tail -n +2 file1 > file1.new 
    mv file1.new file1 
done 

这是可怕的!

+0

其实你可以使用'sed'来编辑文件,参见'-i'选项 – CCH

+0

@CCH:'-i'选项是GNU扩展,它不在POSIX/SUS中。 – cdarke