쉘 스크립트를 사용하여 텍스트 파일 구문 분석

쉘 스크립트를 사용하여 텍스트 파일 구문 분석

이 활동이 중단되었습니다. 아래와 같은 txt 파일이 있습니다.

0112 00000 34 JOB RECOVERY status poll (ORDERID 2N000, RUNNO 0001) ACCEPTED, OWNER
0112 00000 35 JOB RECOVERY status poll (ORDERID 2N000, RUNNO 0001)STARTED , APPL TYPE
0112 00000 36 JOB PROCESS Kafka(ORDERID 2N001, RUNNO 0001) ACCEPTED , OWNER
0112 00001 37 JOB PROCESS Kafka (ORDERID 2N001, RUNNO 0001) STARTED, APPL_TYPE
0112 00001 38 JOB RECOVERY  status poll(ORDERID 2N000, RUNNO 0001) ENDED OK ,ELAPSED - 0.02 SEC
0112 00003 39 JOB PROCESS (ORDERID 2N001, RUNNO 0001) ENDED OK, ELAPSED - 2.28 SEC

orderid각 작업에 대해 경과 시간 값을 가져와야 합니다 . orderid2N000이면 경과 시간 0.02초를 얻어야 합니다. 이는 orderid쉘 스크립트를 사용하여 파일에서 가져오는 데 필요한 모든 것에 해당됩니다.

이런 출력이 필요합니다

orderid    jobname           ELAPSED
2N000      RECOVERY status   0.02
2NOO1      PROCESS  Kafka   2.28

답변1

sed스크립트는 원하는 작업을 수행해야 합니다.

sed '/ELAPSED/!d;s/.*JOB \([^(]*\)(ORDERID \([^,]*\).*- \([0-9.]*\).*/\2 \1 \3/'

실제 데이터에 맞게 조정해야 할 수도 있으므로 이것이 수행하는 작업을 설명하겠습니다.

  • /ELAPSED/!d d!( ) 를 포함하지 않는 모든 줄을 삭제하세요 ELAPSED. 이 ELAPSED줄에는 필요한 모든 정보가 포함되어 있기 때문입니다. 해당 문자열이 다른 곳에 나타날 수 있는 경우 이에 따라 스크립트를 조정해야 합니다.
  • 다음 s대체 명령에는 행에서 추출할 올바른 부분을 식별해야 하는 복잡한 정규식이 포함되어 있습니다.
    • .*JOBJOB키워드 앞의 모든 항목 과 일치합니다 . 마찬가지로 JOB직업 이름 안에도 나타날 수 있다면 추가 조건이 필요하지만 어떻게 알 수 있나요?
    • [^(]*(orderid가 시작되기 전의 모든 항목 과 일치합니다 . \(\)교체 부품에 배치할 수 있도록 부품이 둘러싸여 있습니다 \1. RECOVERY status poll출력에서처럼 누락되는 대신 전체 작업 이름을 얻을 수 있다는 점에 유의하세요 !poll
    • (ORDERID말한 내용과 일치하므로 다음 부분이 주문됩니다.
    • [^,]*다음 쉼표 앞의 모든 항목과 일치합니다. 이것은 다시 \(\), so it can be referred to as\2`로 둘러싸여 있습니다.
    • .*-마지막 대시와 다음 공백을 포함하여 모든 항목과 일치합니다. 시간이 지나기 전에 다 먹고 싶다
    • [0-9.]*몇 개의 숫자와 포인트입니다. 이는 경과 시간에 맞아야 하며 하위 문자열 번호여야 합니다.\3
    • .*나머지 줄과 일치합니다.SEC
  • 대체 문자열은 \2 \1 \3세 요소를 원하는 순서로 붙여넣고 요소 사이에 공백을 추가합니다. 필요에 따라 조정하십시오.
  • 열 헤더를 첫 번째 행에 배치하려면 직접 수행하세요.

답변2

나는 또한 "쉘 스크립트 사용"을 무시했습니다. 그래서 awk를 사용해 보았습니다.

BEGIN {
  # TAB between the words
  print "orderid        jobname Elapsed"
}
/ ACCEPTED/ {
   p = match($0,/^.... ..... .. ... ([A-Za-z ]*).*ORDERID (.....)/,A)
   if (p>0) {
     # print A[2]
     O[A[2]] = A[1]
   }
}
/ELAPSED/ {
   p = match($0,/ORDERID (.....).*ELAPSED - (.*) SEC$/,A)
   # TAB between the double quotes
   print A[1] " " O[A[1]] "     " A[2]
}

탭으로 구분된 형식을 반환합니다.

orderid jobname Elapsed
2N000   RECOVERY status poll    0.02
2N001   PROCESS Kafka   2.28

관련 정보