2016-08-24 2 views
1

그래서이 코드를 가지고 있습니다. 이것은 $DELETE 변수와 일치하는 라인을 찾는 squid 프록시에 관한 것입니다.
사용자가 deleteall을 입력하여 확인하는 경우 sed는 "s_test" 과 일치하는 모든 줄을 제거합니다. 이제 sed가 $ aclonly 변수와 일치하는 줄을 제거하고 위의 줄도 변수가 될 수 있습니다. 항상 시작할 수 있습니다. 어떤 조언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에 대한 "#PR[0-9]*" 감사

당신은 이것에 대한 나오지도 사용할 수 있습니다 (아래)하지만 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"

    이것은 쉘 변수 aclonly와 동일한 값을 가지는 변수 AWK a을 정의한다.

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

    현재 행, $0,이 새로운 라인에 last을 설정 정규식 a ($aclonly), 다음, 다음 라인을 얻을, 현재를 무시 일치하고 나머지 명령을 건너 뛰면 next 행으로 이동하십시오.

  • NR>1{print last}

    이 첫 번째 줄이없는 경우

    last, 이전 행을 인쇄 할 수 있습니다.

  • last=$0

    업데이트 현재 행, $0의 내용으로 변수 last.

  • 우리가 파일의 마지막 줄을 읽은 후 END{if (!(last~a))print last}

    만큼이 정규 표현식 a과 일치하지 않는 인쇄 last.

두 가지 예 첫 번째 테스트 파일로

, 고려 :

$ 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: 

로를 두 번째 예 :이 파일을 고려하십시오.

이 파일에 대한
$ 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 

다음 인쇄 :

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

우리 두 시험이 적용 :

$ 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 
Example: 
$ sed -n '/s_test/{n; $p; x; d}; x; 1!p; ${x;p;}' file2 
Example: 
other 
text 
last 
0

고려 grep : -B 옵션을 사용하면 패턴 일치 전에 줄 수를 지정할 수 있습니다. -n 결합도 행 번호

그렙 한 패턴 파일 -B -n 다른 명령과 함께

당신에게 패턴 위의 라인의 바로 행 번호를 줄 것이다 제공

grep -n -B 1 패턴 파일 | 헤드 -n 1 | SED의 /-..*// g '

이 다음 SED하여 행 번호를 삭제할 수있다

, N은 행 번호

나오지'N 디부 파일

이고
관련 문제