programing

정규식과 일치하는 첫 번째 줄 뒤에 파일의 일부를 가져오는 방법

yellowcard 2023. 4. 15. 08:42
반응형

정규식과 일치하는 첫 번째 줄 뒤에 파일의 일부를 가져오는 방법

1000줄 정도의 파일이 있습니다.나는 내 grep 문장과 일치하는 줄 뒤에 내 파일의 부분을 원한다.

즉, 다음과 같습니다.

cat file | grep 'TERMINATE'     # It is found on line 534

그래서 535번 줄에서 1000번 줄까지 파일을 더 처리해 주셨으면 합니다.

내가 어떻게 그럴 수 있을까?

다음은 일치하는 라인을 인쇄합니다.TERMINATE일의마 마지: :

sed -n -e '/TERMINATE/,$p'

★★★★ -n 을 디세블로 .sed한 후 하는 것을 .-e에 대한 스크립트를 표시하다sed,/TERMINATE/,$) 으로, 「(행)」에 하는 최초의 행을 합니다.이것은, 에 일치하는 첫 번째 행을 의미합니다.TERMINATE과 같은 것)을 파일 끝에 표현(Grep 등).$및 , 。p인쇄하다

일치하는 라인 뒤에 오는 라인에서 인쇄됩니다.TERMINATE파일의 마지막까지: (일치하는 행 뒤에 EOF, 일치하는 행은 포함하지 않음)

sed -e '1,/TERMINATE/d'

★★★★ 1,/TERMINATE/ 「(행)」의 첫 번째 행에의 입력의 첫 입니다.TERMINATE및 " " " 입니다.d는 현재 행을 삭제하고 다음 행으로 건너뜁니다.~로sed은, 행이 됩니다.행은, 행이 됩니다.TERMINATE력의의마마마마마

앞에 있는 TERMINATE:

sed -e '/TERMINATE/,$d'

두 줄 '로 싶은 경우TERMINATE 두 로 한에 정리할 수 있습니다.

sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file

before 파일 및 after 파일에는 terminate 행이 포함되어 있기 때문에 각 파일을 처리하려면 다음과 같이 하십시오.

head -n -1 before
tail -n +2 after

sed 스크립트에서 파일 이름을 하드 코딩하지 않으려면 다음을 수행할 수 있습니다.

before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file

그 .$ 않습니다.$wvariable(스크립트 주위에 작은 따옴표 대신 큰따옴표를 사용합니다).

sed가 파일명이 끝나는 것을 알 수 있도록 스크립트의 파일명 뒤에 새로운 행이 중요하다는 것을 말하는 것을 잊었습니다.

의 「Hardcoded」는 합니까?TERMINATE 변수로?

일치하는 텍스트에 대한 변수를 만든 다음 이전 예제와 동일한 방법으로 수행합니다.

matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file

이전 예시와 일치하는 텍스트에 변수를 사용하는 경우:

## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"

이러한 경우 텍스트를 변수로 대체할 때 중요한 사항은 다음과 같습니다.

  1. 수수(()$variablename로 있습니다.single quotes' ]는 '변수 [ ]의 '변수'입니다.double quotes"] ] 유언을 그러니까, 당신은 모든 것을 바꿔야 합니다.single quotes로로 합니다.double quotes★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  2. sed "a"라는 문자가 포함되어 있습니다.$에 '아까보다'와 같은.$p,$d,$w 때문에, 필요가 있습니다$\] 예를 들어맞습니다.\$p,\$d,\$w.

간단한 근사치로서 다음과 같이 사용할 수 있습니다.

grep -A100000 TERMINATE file

가 'GREP'에 해당합니까?TERMINATE10만 명

man 페이지부터:

-A NUM, --after-context=NUM

일치하는 행 후에 후행 컨텍스트의 NUM 행을 인쇄합니다.연속된 일치 그룹 사이에 그룹 구분 기호(--)를 포함하는 행을 배치합니다.-o 또는 --only-matching 옵션을 사용하면 이 옵션은 효과가 없으며 경고가 표시됩니다.

여기서 사용하는 도구는 AWK입니다.

cat file | awk 'BEGIN{ found=0} /TERMINATE/{found=1}  {if (found) print }'

구조:

  1. found 변수를 0으로 설정하여 false를 평가했습니다.
  2. 정규 표현과 일치하는 'TERMINATE'가 발견되면 1로 설정합니다.
  3. "found" 변수가 True로 평가되면 다음과 같이 출력합니다.

다른 솔루션은 대용량 파일에 사용할 경우 메모리를 많이 소비할 수 있습니다.

내가 당신의 질문을 정확히 이해한다면 당신은 그 뒤의 대사를 원합니까? TERMINATE는 )TERMINATE- 회선. AWK는 다음과 같이 간단하게 할 수 있습니다.

awk '{if(found) print} /TERMINATE/{found=1}' your_file

설명:

  1. 베스트 프랙티스는 아니지만 모든 변수가 0으로 기본 설정되거나 정의되지 않은 경우 빈 문자열에 의존할 수 있습니다. 첫 표현은요.if(found) print는,
  2. 인쇄가 끝나면, 이것이 스타터 라인인지 아닌지를 확인합니다(포함되어서는 안 됩니다).

그러면 다음 이 모두 인쇄됩니다.TERMINATE . - 행


일반화:

  • 시작선과 끝선이 있는 파일이 있고 시작선과 끝선을 제외한 두 줄 사이의 선을 사용하려고 합니다.
  • 시작 행과 끝 행은 행과 일치하는 정규 표현으로 정의할 수 있습니다.

예:

$ cat ex_file.txt
not this line
second line
START
A good line to include
And this line
Yep
END
Nope more
...
never ever
$ awk '/END/{found=0} {if(found) print} /START/{found=1}' ex_file.txt
A good line to include
And this line
Yep
$

설명:

  1. 엔드 라인이 발견되었을 경우는, 인쇄하지 말아 주세요.이 체크는, 실제의 인쇄전에 행해져 결과로부터 엔드 라인을 제외하는 것에 주의해 주세요.
  2. 「 」의 경우는, 합니다.found설정되었습니다.
  3. 시작선이 발견되면 설정found=1다음 행이 인쇄되도록 합니다. 검사는 실제 인쇄 후에 시작선을 결과에서 제외하기 위해 수행됩니다.

주의:

  • 코드는 모든 AWK 변수가 디폴트0 또는 정의되지 않은 경우 빈 문자열에 의존합니다.하지만, 프랙티스가 수 에, 「」를 할 수 .BEGIN{found=0}AWK 표현의 선두에 도달합니다.
  • start-end-block이 여러 개 발견되면 모두 인쇄됩니다.
grep -A 10000000 'TERMINATE' file       

sed보다 훨씬, 훨씬 더 빠릅니다. 특히 매우 큰 파일을 작업합니다.최대 1000만 라인(또는 무엇을 넣든)까지 동작하기 때문에, 이 정도 크기라면, 부딪힌 것에 대응할 수 있습니다.

다음과 같이 Bash 파라미터 확장을 사용합니다.

content=$(cat file)
echo "${content#*TERMINATE}"

하면 여러 이 있어요.sed ★★★★★★★★★★★★★★★★★」awk:

sed -n '/TERMINATE/,$p' file

이것은 다음을 찾습니다.TERMINATE그 행에서 파일 끝까지 인쇄합니다.

awk '/TERMINATE/,0' file

as this this this this this this this 。sed.

있는 인쇄를 개시하는 행의 번호를 할 수 .NR(레코드 수, 최종적으로 회선의 수를 나타냅니다).

awk 'NR>=535' file

$ seq 10 > a        #generate a file with one number per line, from 1 to 10
$ sed -n '/7/,$p' a
7
8
9
10
$ awk '/7/,0' a
7
8
9
10
$ awk 'NR>=7' a
7
8
9
10

어떤 이유로든 sed 사용을 피하고 싶은 경우, 다음에 일치하는 라인을 출력합니다.TERMINATE일의마 마지: :

tail -n "+$(grep -n 'TERMINATE' file | head -n 1 | cut -d ":" -f 1)" file

그리고 다음 행은 일치하는 다음 행에서 인쇄됩니다.TERMINATE일의마 마지: :

tail -n "+$(($(grep -n 'TERMINATE' file | head -n 1 | cut -d ":" -f 1)+1))" file

sed가 할 수 있는 것을 1개의 프로세스로 하기 위해서는 2개의 프로세스가 필요하며, grep의 실행과 tail의 실행 사이에 파일이 바뀌면 일관성이 없어지기 때문에 sed 사용을 권장합니다.이 포함되지 않은 경우TERMINATE첫 번째 명령어가 실패합니다.

jfg956의 훌륭한 답변 대신 일치하는 행이 포함되지 않음:

이것도 한 가지 방법일 수 있어요.파일의 어떤 행에 grep 워드가 있는지, 파일에 몇 행이 있는지 알고 있는 경우:

grep -A466 'TERMINATE' file

bash 명령어로 text file log.txt에서 몇 개의 마크 행을 찾습니다.마크는 #mark1678793202693 이며, 이 마크는 텍스트 파일에 2번 포함되어 있습니다.나는 항상 같은 표시 두 개 사이에 블록을 인쇄하고 싶다.

$a는 텍스트 파일 로그에 있는 모든 행 수를 포함합니다.txt

$aro는 어레이로의 변환 변수 $a입니다.

$s는 시작선 - 라인에서 처음 발견된 패턴입니다.

$e끝줄 - 로그의 두 번째 패턴입니다.txt

이제 sed를 사용하여 lineNumber에서 lineNumber까지의 행을 인쇄할 수 있습니다.

a=$(awk '/#mark1678793202693/{print NR}' log.txt) ; aro=($a),s=${aro[0]};e=${aro[1]} ; sed -n -e "${s}","${e}p" log.txt

sed는 업무에서 훨씬 더 나은 도구입니다.

sed -n '/re/,$p' file

서 ''는re정규 표현입니다.

또 다른 옵션은 GREP입니다.--after-contextflag. 종료할 숫자를 입력해야 합니다. 파일에서 wc를 사용하면 정지할 올바른 값을 제공해야 합니다.이것과 조합하다-n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

마지막으로 발견된 행 "TERMINATE"에서 파일의 마지막 행까지 모든 행이 인쇄됩니다.

LINE_NUMBER=`grep -o -n TERMINATE $OSCAM_LOG | tail -n 1 | sed "s/:/ \\'/g" | awk -F" " '{print $1}'`
tail -n +$LINE_NUMBER $YOUR_FILE_NAME

언급URL : https://stackoverflow.com/questions/7103531/how-to-get-the-part-of-a-file-after-the-first-line-that-matches-a-regular-expres

반응형