Suponhamos que exista um comando como:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
A saída é a seguinte:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Agora, minha pergunta é: Existe algum comando que imprima apenas o que está dentro das vírgulas invertidas, ou seja " "
,?
E você poderia explicar um pouco o comando? Obrigado! antecipadamente.
command-line
text-processing
Rafael
fonte
fonte
cat
em um tubo é quase sempre um desperdício de recursos (AKA UUOC );grep
já pode ler sua entrada de um arquivo (ou seja,grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic
faz exatamente a mesma coisa, mas 1. É mais curto 2. É mais fácil de entender 3. Ele não bifurca um shell adicional e um processo adicional). Em 99% dos casos, usar o gato no início do tubo sem concatenar vários arquivos é apenas prejudicial. :)cat
, embora inútil nesse caso, facilitaria a edição de toda a linha de comandos no futuro, caso você queira alterar / adicionar / remover algo mais tarde, talvez umtr
oucut
, etc., não precise localizar e mover o nome do arquivo , verifique se o outro comando o suporta, encontre onde colocá-lo etc. E para um pequeno arquivo de teste, ele adiciona apenas 0,002s. (Eu provavelmente passou mais tempo digitando isso do que eu jamais vou guardar na vida de evitar supérfluoscat
's)cat
ajuda aqui? Você pode fazergrep foo file | tr
ou... | cut
tão facilmente quantocat file | tr | grep ...
. Ocat
just adiciona cinco caracteres extras, um pipe extra e uma chamada de programa extra e não simplifica nada.Respostas:
Sim, você pode fazer isso. Seu comando seria:
que retornaria apenas:
O
awk
comando usa separadores de campo com o-F
comando e, para configurá-lo para usar aspas duplas, você o digita com aspas simples à sua volta-F'"'
. Em seguida, o'{print $2}'
comando awk para imprimir o segundo conjunto após o separador de campos.Espero que isto ajude!
fonte
cat
egrep
. Você pode substituircat
egrep
participarawk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic
. Menos encanamento, deixando o AWK fazer todo o trabalho, o que é mais do que capaz de fazer #awk
comando. =)Você pode fazer isso com um único
grep
comando:Ou (um pouco mais longo e mais convencido):
-P
: indicagrep
para interpretar o padrão como um PCRE (Perl Compatible Regular Expression);-o
: dizgrep
para imprimir apenas a correspondência;^CONFIG_ARCH_DEFCONFIG="
: corresponde a umaCONFIG_ARCH_DEFCONFIG="
sequência no início da linha;\K
: descarta a substring correspondida anteriormente;# 1:
[^"]*
: corresponde a qualquer número de qualquer caractere que não seja"
(avidamente).# 2:
.*?
: corresponde a qualquer número de qualquer caractere (preguiçosamente);(?=")
: lookahead (afirmação de comprimento zero, não corresponde a nenhum caractere); corresponde se o caractere a seguir for a"
.fonte
Existem muitas maneiras de esfolar esse gato, aqui está uma
sed
maneira:Aqui, estamos combinando a linha e capturando a parte desejada, ou seja, a parte entre aspas duplas (
([^"]+)
) e, em seguida, substituindo a linha inteira pelo grupo capturado (\1
).Exemplo:
fonte
O que não
perl
?O
perl
irá-p
criar todas as linhas depois de aplicar o script fornecido por-e
. Os/foo/bar/
substituiráfoo
combar
. Padrões em parênteses são "capturados" e pode ser referido como$1
,$2
...$N
onde$1
é o 1º padrão capturado,$2
o segundo etc. A expressão regular irá procurar por tudo até a primeira citação (.*?"
), em seguida, capturar a 0 ou mais não"
caracteres ([^"]*
) e depois todo o resto. A coisa toda é substituída pelo padrão capturado.Você também pode deixar o padrão correspondente a
perl
:fonte
with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
Aqui está uma combinação de
grep
ecut
, que faz o mesmo trabalho.Explicação:
grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic
é a parte que se encontra a linha, na sintaxe grep padrão:grep [OPTIONS] PATTERN [FILE...]
. A saída passa pelo tubo para a próxima etapacut -d"\"" -f2
. Esta parte usa o recorte para cortar o texto separado por delimitador específico (que é especificado com-d
sinalizador). Temos que escapar da aspas duplas com barra invertida para que o shell permita tomar aspas duplas como uma das opções docut
comando, em vez de inserir a própria shell. Agoracut
irá tratar a saída degrep
como separados por"
e dividiu-se em três colunas,CONFIG_ARCH_DEFCONFIG
,arch/x86/configs/x86_64_defconfig
, e o espaço vazio. A linha que precisamos é a segunda coluna, isso significa que precisamos usar o-f2
sinalizador.fonte
Como atualmente estou aprendendo,
python
aqui está uma versão usando exatamente isso.Exemplo de execução:
fonte
line.startswith
porquere.match
é muito mais lento que o #startswith