2013-08-06 3 views
1

Нужна ваша помощь со скриптом, который удаляет строки с помощью команды «для».Удалить строки из списка

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 

В конце сценария файл1 должен быть пустым. Благодаря

Асаф

+0

1. Убейте «кошку», вместо этого используйте 'read'. 2. 'sed' не изменяет входной файл, он записывает в stdout. – 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 в СЭД для редактирования исходного файла:

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

Hi, Спасибо за быстрый ответ. Есть ли у вас экстерьер, как это сделать с чтением? он должен быть с петлей. –

1

sed не изменяет входной файл, он изменяет только свой шаблон буфер, который записывается на стандартный вывод (по умолчанию). Вы не можете редактировать файл с помощью 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