다음과 같은 "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