첫 번째 게임 이후 특정 줄부터 시작하여 두 게임 사이의 모든 데이터를 어떻게 인쇄할 수 있습니까? 예를 들어, 두 개의 패턴이 Linux
있고 이 두 단어 사이에 항목이 있고 단어 뒤의 특정 줄 (아래 예에서는 Linux 뒤의 6번째 줄, 단어까지) Unix
에 대한 데이터를 인쇄하고 싶다고 가정해 보겠습니다 .Linux
Unix
Linux
12
32
34
556
676
77
85434
rdb
232323
232435656
Unix
98736
4345
4546456
456
예상 출력:
85434
rdb
232323
232435656
awk, sed 및 grep을 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
상대 주소 지정이 보일 때마다 손을 뻗어 찾아보아야 합니다 ed
.
echo '/Linux/+7,/Unix/-1p' | ed -s input_file.txt -
또는 정리로서:
ed -s input_file.txt - <<\EOF
/Linux/+7,/Unix/-1p
EOF
답변2
이 시도,
awk '/^Linux$/{flag=1;next}/^Unix$/{flag=0}flag' file | tail -n +7
아니면 tail
:
awk '/^Linux$/{flag=1;n=NR;next}/^Unix$/{flag=0};flag&&NR>(n+6);' file
설명하다:
- 패턴을 검색하여
^Linux$
발견되면flag
1(true)로 설정되어next
해당 행으로 바로 이동합니다. ^Unix$
패턴을 찾을 때까지 계속 진행하여flag
0(false)으로 설정합니다.- 마지막
flag
것들은 awk 특정 기호입니다. true 이면flag
행을 인쇄하고, 그렇지 않으면 아무 작업도 수행하지 않습니다. flag
변수 이름만 있으면f
또는 등 무엇이든 될 수 있습니다printthisline
.
Gnu 사용 sed
:
sed '/^Linux$/,/^Unix$/{//!b};d' file | tail -n +7
답변3
그 중 하나를 쓰겠습니다
sed -n '/Linux/,/Unix/p' file | sed '1,7d;$d'
# or
awk '/Linux/ {nr = NR} /Unix/ {exit} nr && NR > nr+6' file
답변4
검색하면 grep
다음과 같이 할 수 있습니다.
grep -A 5 "string used to search" <path-to-file(s)>
일치하는 문자열 다음에 5줄이 표시됩니다.grep -B 5 "string used to search" <path-to-file(s)>
일치하는 문자열 앞에 5줄이 표시됩니다.grep -C 5 "string used to search" <path-to-file(s)>
일치하는 문자열 앞뒤 5줄이 표시됩니다(C는 컨텍스트를 나타냄).
귀하의 예를 들어 다음과 같습니다
grep -A 2 -B 1 "rdb" <path-to-file(s)>