목록을 가져오고 파일에서 제거하는 방법은 무엇입니까?

목록을 가져오고 파일에서 제거하는 방법은 무엇입니까?

/etc/remotedomains에서 제거해야 할 도메인 이름의 긴 목록이 있습니다. 파일의 특정 순서가 아닐 수도 있습니다. 각 필드는 한 줄에 있습니다.

목록을 반복하여 원격 도메인에서 행을 찾아서 삭제하려면 어떻게 해야 합니까?

답변1

grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains

-v패턴과 일치하지 않는 행만 출력하도록 grep에 지시합니다 .

-f listgrep에게 파일에서 패턴을 읽도록 지시합니다 list.

패턴을 정규식이 아닌 일반 문자열로 해석하도록 grep에 지시합니다 -F(따라서 정규식 메타문자에 문제가 발생하지 않습니다).

예를 들어 줄이나 줄 이 아닌 줄만 삭제해야 하는 -x패턴이 있는 경우 grep에게 전체 줄을 일치시키라고 지시합니다 .foofoofoobarbarfoo

답변2

뉴스레터를 활용해보세요!

comm -23 /etc/remotedomains remove

매뉴얼 페이지에서:

정렬된 파일 FILE1과 FILE2를 한 줄씩 비교합니다.

옵션이 없으면 세 개의 출력 열이 생성됩니다. 첫 번째 열에는 FILE1에 고유한 줄이 포함되어 있고, 두 번째 열에는 FILE2에 고유한 줄이 포함되어 있으며, 세 번째 열에는 두 파일에 공통된 줄이 포함되어 있습니다.

옵션 -1, -2 및 -3은 해당 열을 비활성화합니다.

하지만 파일을 정렬해야 합니다.

답변3

sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt

삭제할 도메인 목록이 파일에 있는 경우:

sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt

노트:

  1. sed가 domainlist.txt를 백업하도록 하려면 -i.bak를 사용하세요.

  2. Removelist.txt가 있는 경우많은수천 개의 항목이 있으면 최대 명령줄 길이를 초과할 수 있습니다. 이런 일이 일어날 가능성은 거의 없지만, 이 사실을 알고 있어야 합니다.

좀 더 생각해 보면 다음과 같은 방법으로 이 위험을 제거할 수 있습니다.

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done

관련 정보