como capturar strings específicas da linha

1

como capturar apenas o sdX da seguinte linha (com o bash / awk / sed / perl one liner)

echo ""dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data","

saída esperada

sdb
sdc
sdd
sde
sdf
    
por yael 22.12.2017 / 10:48

5 respostas

2

Você pode usar os argumentos GREP :

   -P, --perl-regexp
          Interpret the pattern as a Perl-compatible regular expression
          (PCRE).  This is experimental and grep -P may warn of
          unimplemented features.
   -o, --only-matching
          Print only the matched (non-empty) parts of a matching line,
          with each such part on a separate output line.

Então seu comando seria:

echo ""dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data"," | grep -oP "\w*sd\w*"
sdb
sdc
sdd
sde
sdf
    
por 22.12.2017 / 11:41
1

Use

echo ... | grep -Eo "sd[a-z]"

em que -E interpreta o padrão como uma expressão regular (estendida) e -o imprime apenas as partes correspondentes em cada linha.

    
por 22.12.2017 / 11:48
0

Você não especificou qual x deve estar em sdX , portanto, pode-se também supor que pode ser qualquer caractere:

$ echo echo ""dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs /data"," | grep -o 'sd.'
sdb
sdc
sdd
sde
sdf

Um literal . significa qualquer caractere em expressões regulares .

E em perl porque você queria isso explicitamente:

$ echo ""dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data"," | perl -nE 'say $& while /sd./g'
sdb
sdc
sdd
sde
sdf
    
por 22.12.2017 / 12:03
0

O resultado acima é alcançado pelo awk one liner

 echo " ""dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data","" | sed "s/,/\n/g" | awk -F "/" '{print $3}' | sed '/^$/d'

saída

sdb sdc sdd sde sdf

por 23.12.2017 / 10:54
-1
echo '"dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data",' 
"dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data",
echo '"dfs.datanode.data.dir" : "/rid/sdb/oo/hdfs/data,/rid/sdc/oo/hdfs/data,/rid/sdd/oo/hdfs/data,/rid/sde/oo/hdfs/data,/rid/sdf/oo/hdfs/data",' | grep -Po 'sd\w'
sdb
sdc
sdd
sde
sdf
    
por 22.12.2017 / 11:37

Tags