você pode usar o comando cut
para essa finalidade.
grep Path filename |cut -c6-
Aqui, a opção -c6-
significa imprimir do 6º ao último caractere.
Eu quero imprimir uma parte de uma linha em um arquivo. A linha inteira parece assim.
Path=fy2tbaj8.default-1404984419419
Eu quero imprimir apenas os caracteres após Path=
. Eu tentei grep Path filename | head -5
. Mas não está funcionando. Ele ainda mostra toda a linha. Como posso fazer isso?
você pode usar o comando cut
para essa finalidade.
grep Path filename |cut -c6-
Aqui, a opção -c6-
significa imprimir do 6º ao último caractere.
Você pode usar grep
e apenas grep
:
grep -oP "(?<=Path=).*" file
Explicação :
De man grep
:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-P, --perl-regexp
Interpret PATTERN as a Perl compatible regular expression (PCRE)
O lookbehind (?<=Path=)
afirma que na posição atual na string, o que precede são os caracteres% código%. Se a afirmação for bem-sucedida, o mecanismo corresponderá ao padrão de resolução.
Para a sintaxe de expressões regulares do Perl 5, leia a página de manual de expressões regulares do Perl .
A solução awk
é o que eu usaria, mas um processo um pouco menor é sed
e pode produzir os mesmos resultados, mas substituindo a parte PATH da linha por ""
, ou seja
sed -n 's/^Path=//p' file
O comportamento padrão -n
substitui sed
s de "imprimir todas as linhas" (por isso, -n
= sem impressão),
e para imprimir uma linha, adicionamos o caractere p
após a subestação. Apenas linhas onde a substituição acontece serão impressas.
Isso lhe dá o comportamento que você pediu, de grep
ing para uma string, mas removendo a parte Path=
da linha.
Se, por comentários de David Foerster, você tiver um arquivo grande e desejar parar o processamento assim que tiver correspondido e imprimido a primeira correspondência com 'Path =', poderá dizer ao sed para sair, com o comando q
. Observe que você precisa torná-lo um grupo de comando cercando ambos em { ..}
e separando cada comando com ;
. Então o comando aprimorado é
sed -n 's/^Path=//{p;q;}' file
IHTH
grep
greps uma linha de texto e a exibe. head
exibe as primeiras linhas de texto n , não caracteres.
Você está procurando sed
ou awk
:
awk '{print }' FS='='
Isso define =
como um separador de campo e imprime o segundo campo.
Com o GNU grep:
$ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*'
fy2tbaj8.default-1404984419419
\K
mantém as coisas restantes de \ K, não inclua em $&
.
Claro que a solução é usar grep -Po
.
Vamos adicionar outras soluções para completar:
com cut
, definindo o delimitador como =
:
cut -d'=' -f2 file
Pode ser um pouco arriscado, mas você também pode originar o arquivo, para que $Path
contenha o código valor.
source file
echo "$Path"
$ cat a
this=aaabbccc
that=dddeee
$ source a
$ echo "$this"
aaabbccc
$ echo "$that"
dddeee
Conforme comentários, veja como source
apenas parte do arquivo:
$ cat a
Path=22
Path=33
$ source a
$ echo $Path
33
$ source <(head -1 a)
$ echo $Path
22
Tags command-line scripts grep