첫 번째 일치 후 특정 줄에서 시작하여 두 일치 사이의 특정 줄 범위를 인쇄합니다.

첫 번째 일치 후 특정 줄에서 시작하여 두 일치 사이의 특정 줄 범위를 인쇄합니다.

첫 번째 게임 이후 특정 줄부터 시작하여 두 게임 사이의 모든 데이터를 어떻게 인쇄할 수 있습니까? 예를 들어, 두 개의 패턴이 Linux있고 이 두 단어 사이에 항목이 있고 단어 뒤의 특정 줄 (아래 예에서는 Linux 뒤의 6번째 줄, 단어까지) Unix에 대한 데이터를 인쇄하고 싶다고 가정해 보겠습니다 .LinuxUnix

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$발견되면 flag1(true)로 설정되어 next해당 행으로 바로 이동합니다.
  • ^Unix$패턴을 찾을 때까지 계속 진행하여 flag0(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)>

관련 정보