정규식과 일치하는 첫 번째 줄 뒤에 파일의 일부를 가져오는 방법
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
그 .$
않습니다.$w
variable(스크립트 주위에 작은 따옴표 대신 큰따옴표를 사용합니다).
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"
이러한 경우 텍스트를 변수로 대체할 때 중요한 사항은 다음과 같습니다.
- 수수(()
$variablename
로 있습니다.single quotes
'
]는 '변수 [ ]의 '변수'입니다.double quotes
"
] ] 유언을 그러니까, 당신은 모든 것을 바꿔야 합니다.single quotes
로로 합니다.double quotes
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ sed
"a"라는 문자가 포함되어 있습니다.$
에 '아까보다'와 같은.$p
,$d
,$w
때문에, 필요가 있습니다$
\
] 예를 들어맞습니다.\$p
,\$d
,\$w
.
간단한 근사치로서 다음과 같이 사용할 수 있습니다.
grep -A100000 TERMINATE file
가 'GREP'에 해당합니까?TERMINATE
10만 명
man 페이지부터:
-A NUM, --after-context=NUM
일치하는 행 후에 후행 컨텍스트의 NUM 행을 인쇄합니다.연속된 일치 그룹 사이에 그룹 구분 기호(--)를 포함하는 행을 배치합니다.-o 또는 --only-matching 옵션을 사용하면 이 옵션은 효과가 없으며 경고가 표시됩니다.
여기서 사용하는 도구는 AWK입니다.
cat file | awk 'BEGIN{ found=0} /TERMINATE/{found=1} {if (found) print }'
구조:
- found 변수를 0으로 설정하여 false를 평가했습니다.
- 정규 표현과 일치하는 'TERMINATE'가 발견되면 1로 설정합니다.
- "found" 변수가 True로 평가되면 다음과 같이 출력합니다.
다른 솔루션은 대용량 파일에 사용할 경우 메모리를 많이 소비할 수 있습니다.
내가 당신의 질문을 정확히 이해한다면 당신은 그 뒤의 대사를 원합니까? TERMINATE
는 )TERMINATE
- 회선. AWK는 다음과 같이 간단하게 할 수 있습니다.
awk '{if(found) print} /TERMINATE/{found=1}' your_file
설명:
- 베스트 프랙티스는 아니지만 모든 변수가 0으로 기본 설정되거나 정의되지 않은 경우 빈 문자열에 의존할 수 있습니다. 첫 표현은요.
if(found) print
는, - 인쇄가 끝나면, 이것이 스타터 라인인지 아닌지를 확인합니다(포함되어서는 안 됩니다).
그러면 다음 행이 모두 인쇄됩니다.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
$
설명:
- 엔드 라인이 발견되었을 경우는, 인쇄하지 말아 주세요.이 체크는, 실제의 인쇄전에 행해져 결과로부터 엔드 라인을 제외하는 것에 주의해 주세요.
- 「 」의 경우는, 합니다.
found
설정되었습니다. - 시작선이 발견되면 설정
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의 훌륭한 답변 대신 일치하는 행이 포함되지 않음:
awk '/TERMINATE/ {y=1;next} y'
('grep + A'에 대한 Hi Vu의 답변: 경기 후 모든 것을 인쇄합니다.)awk '/TERMINATE/ ? c++ : c'
('grep + A'에 대한 Steven Penny의 답변: 경기 후 모든 것을 인쇄합니다.)perl -ne 'print unless 1 .. /TERMINATE/'
('grep + A'에 대한 tchrist의 답변: 경기 후 모든 것을 인쇄합니다.)
이것도 한 가지 방법일 수 있어요.파일의 어떤 행에 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-context
flag. 종료할 숫자를 입력해야 합니다. 파일에서 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
'programing' 카테고리의 다른 글
WPF 사용자 제어 설계 시간 크기 (0) | 2023.04.15 |
---|---|
NSURLSession을 사용하여 POST 요청 전송 (0) | 2023.04.15 |
파일에서 n번째 줄을 가져오는 Bash 도구 (0) | 2023.04.15 |
MVVM: ListBox에 바인딩하고 있습니다.선택된항목이 업데이트되지 않습니까? (0) | 2023.04.15 |
Bash가 다른 디렉토리 컨텍스트에서 명령을 실행하려면 어떻게 해야 합니까? (0) | 2023.04.15 |