동일한 패턴을 대체하려면 파일의 문자열을 다른 값으로 대체하세요.

동일한 패턴을 대체하려면 파일의 문자열을 다른 값으로 대체하세요.

그 안에 이런 문자열이 있어요/etc/mail/virtusertable

[email protected]    error:nouser Account temporary disabled
[email protected]    error:nouser Account temporary disabled
[email protected]    error:nouser Account temporary disabled

모든 것을 내가 얻을 수 error:nouser Account temporary disabled있는 적절한 콘텐츠로 바꾸고 싶습니다.virtuser_NNN/etc/dovecot/dovecot.passwd

나는 같은 결과로 다른 변형을 시도했습니다. 모두를 error:nouser Account temporary disabled첫 번째 것으로 교체하십시오 virtuser_NNN./etc/dovecot/dovecot.passwd

내 스크립트를 실행하면 다음과 같습니다.

[email protected]    virtuser_1
[email protected]    virtuser_1
[email protected]    virtuser_1

내 스크립트는 다음과 같습니다

 cat /etc/mail/virtusertable_back | grep example.com |
 grep 'error:nouser Account temporary disabled' | awk '{print $1}' |
 xargs -I{} grep {} /etc/dovecot/dovecot.passwd | awk -F'::' '{print $2}' |
 xargs -I{} sh -c 'grep {} /etc/passwd' | awk -F: '{print $1}'|
 xargs -n1 -P1 -I{} sed -i 's/error\:nouser Account temporary disabled/{}/' /etc/mail/virtusertable_back

예, 저는 이 작업을 복사하고 있습니다 /etc/mail/virtusertable.

그리고 /etc/dovecot/dovecot.passwd다음과 같은 형식의 기록이 있습니다.

[email protected]:*$1$hash here:user id:group id::/var/www/userlogin/data/email/example.com/mail:::/var/mail/virtuser_NNNN

추가하려면 전체 파일이 아닌 특정 메일 도메인의 해당 VM에만 적용되도록 오류 메시지가 포함된 문자열을 변경하고 싶습니다.

답변1

나는 이것을 하기 위해 Perl을 사용할 것이다. 이메일과 관련 사용자 이름을 /etc/dovecot/dovecot.passwd해시에 저장하고 다음으로 바꿉니다 /etc/mail/virtusertable.

$ perl -i -ape 'BEGIN{
                   open($fh,"/etc/dovecot/dovecot.passwd");
                    while(<$fh>){ @G=split(/:/); $k{$G[0]}=$G[2]; }
            }
            s/error:nouser Account temporary disabled/$k{$F[0]}/ if defined $k{$F[0]};
'  /etc/mail/virtusertable > newfile

설명하다

-iPerl 은 sed -i.-a@F​좋다 awk. -p"제공된 스크립트를 적용한 후 각 줄을 인쇄합니다"를 의미합니다 -e.

스크립트 자체는 (입력 파일을 읽기 전에 ) /etc/dovecot/dovecot.passwd청크 로 읽고 각 행을 배열 로 분할한 다음 각 이메일을 값이 사용자 이름인 해시의 키로 저장합니다 .BEGIN{}/etc/mail/virtusertable:@G%k

/etc/mail/virtusertable완료되면 처리가 계속되며 각 사용자 이름이 첫 번째 필드(정의된 경우)의 이메일에 해당하는 사용자 이름으로 대체됩니다.error:nouser Account temporary disabled

답변2

백슬래시가 없으면 다음 파이프가 제대로 작동합니다.virtuser_NNN이름:

tbl=/etc/mail/virtusertable
pw=/etc/dovecot/dovecot.passwd
cut  -d:  -f1 "$pw" |  
grep -Fnf-    "$tbl"|
sed  -e's|:.*/\(.*\)|s/:nouser/:\1/|' | 
sed  -f-      "$tbl"

그것은:

  • 먼저 cut각 줄에서 콜론이 아닌 문자의 첫 번째 시퀀스를 제외한 모든 문자를 제거합니다.dovecot.passwd

  • grep-F고정 문자열 일치 결과 의 경우virtusertable

  • s///줄 번호와 슬래시가 아닌 문자 시퀀스의 마지막 항목을 제외하고 이 결과의 모든 문자를 문자열로 바꿉니다. 예를 들면 다음과 같습니다.

    • [LINENO]s/:nouser/:not-slashes/
  • 마지막으로 사용한저것sed스크립트 로 출력virtusertable

관련 정보