다른 파일의 파일에서 여러 줄 찾기

다른 파일의 파일에서 여러 줄 찾기

여러 줄이 포함된 텍스트 파일이 있고 특정 텍스트가 포함된 줄을 검색하고 이 줄의 시작 부분에 #을 추가하고 싶습니다.

예: file1 변경하고 싶습니다.

acnet           6801/tcp                # ACNET Control System Protocol
acnet           6801/udp                # ACNET Control System Protocol
dlip            7201/tcp                # DLIP
dlip            7201/udp                # DLIP
ssp-client      7801/tcp                # Secure Server Protocol - client
ssp-client      7801/udp                # Secure Server Protocol - client

inputfile1에 있는 포트를 찾고 싶습니다. 입력 파일에는 다음이 포함됩니다.

6801
7801

따라서 file1의 최종 출력은 다음과 같습니다.

#acnet           6801/tcp                # ACNET Control System Protocol
#acnet           6801/udp                # ACNET Control System Protocol
dlip            7201/tcp                # DLIP
dlip            7201/udp                # DLIP
#ssp-client      7801/tcp                # Secure Server Protocol - client
#ssp-client      7801/udp                # Secure Server Protocol - client

나는 노력했다

cat /etc/services |grep -f ports.txt | awk  '{ print"#" $g}';

그러나 이것은 나에게 화면에 출력을 제공합니다. 파일에서 어떻게 변경할 수 있나요?

답변1

다음과 같이 시도해 보세요:

awk -F"[ \t]*|/" 'NR==FNR{A[$1]; next} $2 in A { printf "#" }1' ports.txt /etc/services > newfile

출력이 올바르면 다음 위치에 복사할 수 있습니다./etc/services

답변2

sed '/6801\|7801/ {s/^/#/}' input
#acnet           6801/tcp                # ACNET Control System Protocol
#acnet           6801/udp                # ACNET Control System Protocol
dlip            7201/tcp                # DLIP
dlip            7201/udp                # DLIP
#ssp-client      7801/tcp                # Secure Server Protocol - client
#ssp-client      7801/udp                # Secure Server Protocol - client

답변3

REGEXP=$(cat ports.txt | xargs | sed -e 's/ /|/g')
sed -E -i -e "/[[:space:]]$REGEXP\// s/^/#/" inputfile1

이는 의 내용을 기반으로 확장 정규식을 구성한 ports.txt다음 이를 사용하여 inputfile1문자 앞에 추가할 특정 주소(줄)를 선택합니다.#

정규식은 지정된 범위 밖의 어떤 것과도 일치하지 않도록 시작 부분과 /끝 부분에 공백을 사용하여 "고정"됩니다. 예를 들어 앵커가 없으면 25in 은 ports.txt포트 25와 일치할 뿐만 아니라 다음과도 일치합니다. , 등을 25포함하여 그 중 특정 숫자를 포함하는 모든 것 2501.1025250

그런데 ports.txt에 설명을 추가하려면 다음 명령을 사용하십시오.

REGEXP=$(sed -e 's/#.*//' ports.txt | xargs | sed -e 's/ /|/g')
sed -E -i -e "/[[:space:]]$REGEXP\// s/^/#/" inputfile1

위의 첫 번째 버전은오직포트 번호, 공백 및 빈 줄만 포함 하면 제대로 작동합니다 ports.txt. 불필요한 문자(특히 정규식에서 특별한 의미를 갖는 문자)는 예측할 수 없고 거의 확실히 나쁜 결과를 초래할 수 있습니다.

두 번째 버전은 주석(즉, 줄 #의 모든 문자를 포함하여 줄의 문자 뒤의 모든 내용)을 제거하므로 주석의 모든 문자도 허용됩니다(무시됨).

sed또한 ports.txt에 나열된 포트로 인해 명령이 최대 명령줄 길이를 초과하는 경우에도 실패합니다. 크기는 일반적으로 약 128KB이므로 이 경우에는 문제가 되지 않지만 다른 작업에 이 기술을 사용하는 경우 주목할 가치가 있습니다.

관련 정보