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
또는 중 하나와 또 다른 공백 문자가 옵니다.1
5
3
물론 대상 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