sed 또는 awk를 사용하여 단어와 일치하는 단락 추출

sed 또는 awk를 사용하여 단어와 일치하는 단락 추출

다음과 같은 "quota.txt"라는 파일이 있습니다.

DISK_info_start:/usr
Disk: /usr
CURRENT=81
DISK_info_end:/usr

DISK_info_start:/usr/var
Disk: /usr/tmp
CURRENT=1
DISK_info_end:/usr/var

다음과 같은 변수가 있습니다.

entry=/usr

DISK_info_start:$entry에서 DISK_info_end:$entry로 다음과 같이 단락을 추출하고 싶습니다.

DISK_info_start:/usr
Disk: /usr
CURRENT=81
DISK_info_end:/usr

나는 다음 명령을 시도했습니다.

sed -n "\|DISK_info_start:$entry$|,\|DISK_info_end:$lines$|p" quota.txt

그러나 그것은 내가 찾고 있는 것과 정확히 일치하지 않습니다.

이 명령을 조정해 주실 수 있나요? 아니면 대안을 제공해 주실 수 있나요?

답변1

사용 awk:

awk단락 모드에서 사용:

awk -v RS= '/DISK_info_start\:\/usr\n/' quota.txt

여러 단락이 일치하면 추가하고, -v ORS="\n\n"그렇지 않으면 awk일치 사이의 빈 줄을 제거합니다.

\n대신 줄 끝을 찾아야 합니다 $. 후자는 단락의 끝만 표시하기 때문입니다.

변수가 필요한 경우 다음을 인용하세요 /.

entry=/usr
awk -v RS= "/DISK_info_start\:${entry//\//\\\/}\n/" quota.txt

사용 perl:

perl단락 모드( )도 있습니다 -00.

perl -00 -ne '/DISK_info_start\:\/usr\n/ && print' quota.txt

| tr -s '\n'끝에 빈 줄이 인쇄되는 것을 방지하기 위해 추가되었습니다 .


사용 sed:

sed다음과 같이 사용할 수도 있습니다 .

sed -n '/DISK_info_start:\/usr$/,/DISK_info_end:\/usr$/p' quota.txt

이거 진짜 못찾겠다하지만 한 게임에서 다른 게임으로.

답변2

이것을 시도해 보세요 awk. 텍스트 처리에 좋습니다.

awk 'index($0, "DISK_info_start:"D"\n")==1' RS="" ORS="\n\n" D="/usr" quota.txt

DISK_info_start:/usr
Disk: /usr
CURRENT=81
DISK_info_end:/usr

답변3

당신은 시도 할 수 있습니다:grep -A3 DISK_info_start:$entry quota.txt

관련 정보