두 개의 파일이 있습니다 master.tbl
.sites.lst
이 파일은 master.tbl
포트 구성, 포트 이름, IP 주소 등을 포함한 사이트 목록입니다. 일부 줄에는 사이트 설명, 설명 등이 포함되어 있지만 관련이 없습니다. 사이트 구성이 포함된 줄은 공백으로 구분되어 다음과 같이 배열됩니다.
{server} {SITE NAME} {port name} {configuration flags}
포트 이름은 소문자 사이트 이름, 대시, "P" 및 포트 번호로 구성됩니다.
예:
server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments
sites.lst
파일을 검색해야 하는 웹사이트 목록입니다 master.tbl
.
#
다음 조건을 모두 충족하는 각 줄에 대해 주석 처리( 줄 시작 부분에 a 삽입)하고 stoplist.lst
서버 이름과 포트 이름(이름이 지정된 파일로)을 추출 해야 합니다 .
- 다음에 나열된 모든 사이트 이름을 포함합니다.
sites.lst
- "-ADM"이 포함되어 있습니다.
- 포트 번호가 "2"보다 큽니다(예
hawaii23-P3
: ).
위의 예에서 master.tbl
파일은 다음과 같습니다.
server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
#server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments
...다음을 포함합니다( 에 있는 것으로 stoplist.lst
가정 ).HAWAII23
sites.lst
server01 hawaii23-P3
master.lst
거의 300,000개의 행이 있으므로 이 작업을 수동으로 수행하는 것은... 끔찍할 것입니다.
답변1
해결책 은 다음과 같습니다 awk
.
awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl
sites.lst
먼저 배열의 인덱스를 읽고 설정합니다 $0"-ADM"
(예: 사이트 이름 + 문자열 ) . 그런 다음 세 번째 필드의 값을 추출 하고 조건이 충족되면(두 번째 필드가 2에 속하고 2보다 큼) 첫 번째와 세 번째 필드를 인쇄하고 행을 주석 처리합니다. 파일을 그 자리에서 편집하지는 않지만 모든 것이 잘 작동하면 언제든지 다른 파일로 리디렉션하고 원본을 덮어쓸 수 있습니다(요즘에는 해당 옵션이 있음).-ADM
z
master.tbl
-P
p
z
p
stoplist.lst
gnu awk
-i inplace