extrair correspondência de parágrafo com palavras usando sed ou awk [duplicado]

0

Eu tenho um arquivo chamado "quota.txt" como abaixo:

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

Eu tenho uma variável como abaixo:

entry=/usr

Eu quero extrair o parágrafo começando de DISK_info_start: $ entry para DISK_info_end: $ entry assim:

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

Eu tentei este comando:

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

mas, não está fazendo uma correspondência exata que é o que eu estava procurando.

Você pode ajustar esse comando para mim ou fornecer uma alternativa?

    
por David Mac 10.10.2018 / 13:06

3 respostas

2

Usando awk :

Use awk no modo de parágrafo:

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

Se você combinar vários parágrafos, adicione -v ORS="\n\n" , caso contrário, awk removerá linhas em branco entre as correspondências.

Observe que você precisa de \n em vez de $ para encontrar o fim da linha, pois o último marca apenas o final do parágrafo.

Se você precisar de variáveis, certifique-se de citar o / :

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

Usando perl :

perl tem um modo de parágrafo, também ( -00 ):

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

Adicione | tr -s '\n' para evitar imprimir a linha vazia no final.

Usando sed :

Você também pode usar sed da seguinte forma:

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

Isso não encontrará realmente parágrafos , mas de correspondência para correspondência.

    
por 10.10.2018 / 13:10
1

Experimente awk , é bom para processamento de texto:

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
    
por 10.10.2018 / 13:11
-1

Você pode tentar: grep -A3 DISK_info_start:$entry quota.txt

    
por 10.10.2018 / 13:10