2016-08-24 5 views
1

Итак, у меня есть этот код, это прокси-сервер squid, который ищет строки, которые соответствуют переменной $DELETE.
Если пользователь печатает deleteall для подтверждения, то sed удаляет все строки, соответствующие "s_test" Теперь я хочу, чтобы sed удалил строку, которая соответствует переменной aclonly и строке выше, которая также может быть переменной, она всегда начинается с "#PR[0-9]*" Спасибо за любые советыsed, удалите строку, которая находится перед другим

Example: 
#PR0000 
http_access allow s_test     d_test     http_port 

function remove(){ 
source_acl=$(grep $DELETE /etc/squid3/conf.d/$CUSTOMER.conf) 
echo $source_acl 
acl_only=$(echo $source_acl | cut -f2 -d" ") 
echo "#$DELETE = $acl_only" 
echo "#FOLGENE ACL/RULES GEFUNDEN" 
grep $acl_only /etc/squid3/conf.d/$CUSTOMER.conf 
return=$? 
if [ "$return" = "0" ];then 
     echo "WRITE DELETEALL TO REMOVE SHOWN ALCs/RULES" 
     echo "WRITE DELETE TO REMOVE ONLY SOURCE ACL WHICH MATCHES IP" 
     read delete 
     if [ "$delete" = "deleteall" ];then 
       sed -i -e /$acl_only/d /etc/squid3/conf.d/$CUSTOMER.conf 
       return=$? 
       if [ "$return" = "0" ];then 
         echo DELETE SEQUEZ COMPLETET 
       else 
         echo ERROR 
       fi 
     fi 
     if [ "$delete" = "delete" ];then 
       sed -i -e /$DELETE/d /etc/squid3/conf.d/$CUSTOMER.conf 
       return=$? 
       if [ "$return" = "0" ];then 
         echo DELETE SEQUEZ COMPLETET 
       else 
         echo ERROR 
       fi 

     fi 
else 
echo NO MATCHES 

fi 
exit 

ответ

1

Использование AWK

Вы можете использовать СЭД для этого (см ниже), но awk, вероятно, проще. Попробуйте:

awk -v a="$aclonly" '$0~a{getline; last=$0; next} NR>1{print last} {last=$0} END{if (!(last~a))print last}' file 

Как это работает

Awk неявно считывает через файл построчно. Этот скрипт использует две переменные. a содержит регулярное выражение, которое мы хотим совместить. last содержит предыдущую строку.

  • -v a="$aclonly"

    Это определяет переменную AWK a со значением, равным переменной оболочки aclonly.

  • $0~a{getline; last=$0; next}

    Если текущая строка, $0, соответствует регулярному выражению a ($aclonly), а затем игнорировать ток, получить следующую строку, установите last к этой новой линии, а затем пропустить остальные команды и перейти к линии next.

  • NR>1{print last}

    Если это не первая линия, а затем распечатать предыдущую строку, last.

  • last=$0

    Обновление переменной last с содержанием текущей строки, $0.

  • END{if (!(last~a))print last}

    После того как мы читали последнюю строку в файл, печать last до тех пор, как он не соответствует регулярному выражению a.

Два примера

В качестве первого тестового файла, рассмотрим:

$ cat file 
Example: 
#PR0000 
http_access allow s_test     d_test     http_port 

Если мы запустим нашу команду, только первые строки печатает:

$ awk -v a="$aclonly" '$0~a{getline; last=$0; next} NR>1{print last} {last=$0} END{if (!(last~a))print last}' file 
Example: 

As второй пример, рассмотрите этот файл:

$ cat file2 
Example: 
#PR0000 
http_access allow s_test     d_test     http_port 
#PR0000 
http_access allow s_test     d_test     http_port 
other 
text 
#PR0000 
http_access allow s_test     d_test     http_port 
#PR0000 
http_access allow s_test     d_test     http_port 
last 

Для этого файла, следующие печатные издания:

$ awk -v a="$aclonly" '$0~a{getline; last=$0; next} NR>1{print last} {last=$0} END{if (!(last~a))print last}' file2 
Example: 
other 
text 
last 

Использование СЭД

Почти такая же логика может быть использована в СЭД:

sed -n '/s_test/{n; $p; x; d}; x; 1!p; ${x;p;}' file 

Применяя это к нашему два теста файлы:

$ sed -n '/s_test/{n; $p; x; d}; x; 1!p; ${x;p;}' file 
Example: 
$ sed -n '/s_test/{n; $p; x; d}; x; 1!p; ${x;p;}' file2 
Example: 
other 
text 
last 
0

Рассмотрите параметр grep: -B, чтобы указать количество строк до соответствия шаблону. В сочетании с -n также дает номер строки

Grep -n -B 1 файл шаблона

в сочетании с другими командами даст вам только номер строки в строке над рисунком

grep -n -B 1 файл шаблона | head -n 1 | Сед «ы /-..*// г»

это затем можно использовать, чтобы удалить номер строки с помощью СЭД, где N- номер строки

СЭД файл «N D»

Смежные вопросы