두 번째 파일에 나열된 작업 목록에 대한 작업 정의를 검색합니다.

두 번째 파일에 나열된 작업 목록에 대한 작업 정의를 검색합니다.

250,000개의 작업 세부정보가 포함된 파일이 있습니다. 이 소스 파일에서는 모든 작업에 서로 다른 매개변수가 있으므로 각 작업마다 줄 수가 다를 수 있습니다. 유일한 패턴은 각 작업 정의가 브레이크라인으로 시작 insert:하고 브레이크라인으로 끝나는 것입니다.

insert: PPC_SA1   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"
std_err_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.err"
alarm_if_fail: 1
group: P
resources:

insert: PPC_SA2   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0

insert: PPC_SA3   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"

insert: PPC_SA4   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"
std_err_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.err"
alarm_if_fail: 1
group: P
resources:

insert: PPC_SA5   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0

insert: PPC_SA6   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"

목표 위치:

PPC_SA1
PPC_SA5
PPC_SA3

위 목록에 있는 이러한 작업에 대한 항목을 다른 파일로 추출해야 합니다.

insert: PPC_SA1   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"
std_err_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.err"
alarm_if_fail: 1
group: P
resources:

insert: PPC_SA5   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0

insert: PPC_SA3   job_type: CMD
box: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"

답변1

작업이 모두 빈 줄로 끝나기 때문에 perl"단락 모드"에서 사용할 수 있습니다(즉, \n\n빈 줄을 레코드 구분 기호로 간주하여 "단락"을 "줄"로 효과적으로 처리함을 의미).

$ perl -00lne 'print if /insert:\s+PPC_SA[153]\s/' file
insert: PPC_SA1   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"
std_err_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.err"
alarm_if_fail: 1
group: P
resources:

insert: PPC_SA3   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"

insert: PPC_SA5   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0

단락 모드를 활성화 -00하면 스크립트는 일치하는 모든 레코드를 인쇄하고 그 뒤에 insert:\s+PPC_SA또는 중 하나와 또 다른 공백 문자가 옵니다.153

물론 대상 ID가 많으면 실용적이지 않으므로 다음과 같이 일반화할 수도 있습니다.

cat file | 
    perl -00lne 'BEGIN{ $k{$_}++ for @ARGV; @ARGV=()} /insert:\s+(\S+)/; print if $k{$1}' PPC_SA1 PPC_SA5 PPC_SA3

또는 를 사용하여 대상 ID를 한 줄에 하나씩 awk파일(이 예에서는 호출됨)에 저장하고 다음을 실행할 수 있습니다.target_ids

$ awk '(NR==FNR){a[$1]++; next}
       { 
         if(/insert:/ && $2 in a){want=1} 
         if(want){print}
         if(/^\s*$/){want=0}
        }' target_ids file
insert: PPC_SA1   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"
std_err_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.err"
alarm_if_fail: 1
group: P
resources:

insert: PPC_SA3   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"

insert: PPC_SA5   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0

답변2

이건 어때?

awk 'NR==FNR{ trgtJbs[$0]; next } ($2 in trgtJbs)' targetJobs RS='' allJobs

먼저 모든 targetJobs를 읽습니다.targetJobs파일에 있으므로 각 작업을 언급했으므로allJobs파일은 빈 줄로 구분되므로 다음과 같이 설정합니다.오른쪽에코코드에스두 번째 파일의 구분 기호를 빈 줄로 설정하고 각 작업 블록의 두 번째 필드가 있는지 확인합니다.trgtJbs우리가 사용하는 배열은 출력될 것입니다.

출력에 빈 줄을 유지하려면 다음을 수행하십시오.

awk 'NR==FNR{ trgtJbs[$0]; next }
    ($2 in trgtJbs){ print sep $0; sep=ORS }' targetJobs RS='' allJobs

답변3

단락 모드에서는 awk원하는 레코드를 선택할 수 있습니다:

awk -v RS= -v FS='\n' -v ORS='\n\n' '$1~/PPC_SA(1|3|5)[[:space:]]+/' file
insert: PPC_SA1   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"
std_err_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.err"
alarm_if_fail: 1
group: P
resources:

insert: PPC_SA3   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"

insert: PPC_SA5   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0

답변4

sed -n '/^insert.* PPC_SA[153]/,/^$/p' filename



output

insert: PPC_SA1   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"
std_err_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.err"
alarm_if_fail: 1
group: P
resources:

insert: PPC_SA3   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0
description: "Run program"
std_out_file: "/home/PROD/autosys/logs/${AUTO_JOB_NAME}_`date +%y%m%d`.log"

insert: PPC_SA5   job_type: CMD
name: PPC
command: sa
machine: P
owner: cat
permission:
date_conditions: 0

관련 정보