이 패턴의 로그 파일이 있습니다.
Time = 100
GAMG: Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
GAMG: Solving for p, Initial residual = 0.02692910633, Final residual = 0.0004864615367, No Iterations 2
GAMG: Solving for p, Initial residual = 0.005753534485, Final residual = 0.0001502172182, No Iterations 2
GAMG: Solving for p, Initial residual = 0.001526301953, Final residual = 5.384448346e-05, No Iterations 2
GAMG: Solving for p, Initial residual = 0.0004529702305, Final residual = 1.80754637e-05, No Iterations 1
time step continuity errors : sum local = 2.722585271, global = 0.09763545089, cumulative = 0.09763545089
ExecutionTime = 27.35 s ClockTime = 31 s
Time = 101
GAMG: Solving for p, Initial residual = 0.04799119366, Final residual = 0.002390404161, No Iterations 1
GAMG: Solving for p, Initial residual = 0.02803010067, Final residual = 0.0009371130484, No Iterations 2
GAMG: Solving for p, Initial residual = 0.007210353379, Final residual = 0.0002494798057, No Iterations 2
GAMG: Solving for p, Initial residual = 0.002410795933, Final residual = 0.000116871876, No Iterations 2
GAMG: Solving for p, Initial residual = 0.0007431402835, Final residual = 1.649739876e-05, No Iterations 3
GAMG: Solving for p, Initial residual = 0.0003489407136, Final residual = 1.262095062e-05, No Iterations 1
time step continuity errors : sum local = 0.7142966337, global = -0.1125594528, cumulative = -0.01492400189
ExecutionTime = 41.42 s ClockTime = 45 s
Time = 102
그 다음 줄은 Time =
항상 입니다 Iterations 1
. 저는 그 줄을 얻고 싶습니다. 나는 다음과 같은 아이디어를 시도했습니다.
grep을 사용하여 쓰면 다음과 같이 grep -A 2 "Time =" test.txt
표시됩니다.
Time = 100
GAMG: Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
그리고
ExecutionTime = 27.35 s ClockTime = 31 s
Time = 101
awk를 사용하면 cat test.txt | awk '/Time/{getline;getline;print}'
표시됩니다.
GAMG: Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
Time = 101
Time = 102
그 뒤에 나오는 두 줄은 Time = 101
and 입니다 .Time = 102
ExecutionTime
간단히 말해서, 나는 공백이 아닌 첫 번째 줄을 얻고 싶습니다. 그 이후에는 Time =
항상 Iterations 1
. 어떻게 얻을 수 있나요?
답변1
No Iterations 1
한 줄로 끝나는 첫 번째 줄이 인쇄 되도록 하려면 Time = ...
다음 awk
명령을 사용할 수 있습니다.
awk '/^Time =/ {f=1} /No Iterations 1$/ && f {f=0; print}' test.txt
이 awk
명령에는 두 가지 규칙( { ... }
)이 있습니다.
^Time =
행이 정규식과 일치하면, 즉 문자열로 시작하면 첫 번째 행이 처리됩니다Time =
. 이 규칙에서는 발견된 패턴의 "시작선"을 나타내는f
플래그 를 설정하기만 하면 됩니다 .1
No Iterations 1$
행이 정규식과 일치하면 다음을 처리합니다.마치다문자열을 사용하십시오No Iterations 1
.그리고우리는 그것을 이전에 발견했습니다Time =
- 좋습니다. 두 조건이 모두 충족되면 행을 인쇄하고f
로 시작하는 다음 항목이 인쇄되지 않도록 플래그를 재설정합니다No Iterations 1
.
명령문 뒤에 비어 있지 않은 첫 번째 줄만 인쇄하는 Time = ...
(패턴이 포함되어 있는지 확인하지 않고 No Iterations 1
) 좀 더 "완화된" 변형은 다음과 같습니다.
awk '/^Time =/ {f=1; next} NF>0 && f {f=0; print}' test.txt
f
이는 플래그가 설정되어 있는지와 NF
행의 "필드 수"(또는 원하는 경우 열 수)가 0보다 큰지 확인하는 것뿐입니다 . 여기서는 next
다음 줄로 실행을 건너뛰기 위해 첫 번째 규칙에 명령을 추가 해야 합니다 . 그렇지 않으면 -rule이 NF>0
이미 Time =
-lines에 대해 처리되어 해당 -lines만 효과적으로 인쇄됩니다.
귀하의 예를 들어, 둘 다 인쇄합니다:
GAMG: Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
GAMG: Solving for p, Initial residual = 0.04799119366, Final residual = 0.002390404161, No Iterations 1