Supongamos que hay un comando como:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
La salida es como tal:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Ahora, mi pregunta es: ¿Hay algún comando que solo imprima lo que está dentro de las comillas, es decir " "
,?
¿Y podría explicar un poco el comando? ¡Gracias! por adelantado.
command-line
text-processing
Rafael
fuente
fuente
cat
en cuenta que usarlo en una tubería es casi siempre un desperdicio de recursos (AKA UUOC );grep
puede leer su entrada de un archivo ya (es decir,grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic
hace exactamente lo mismo, pero 1. Es más corto 2. Es más fácil de entender 3. No bifurca un shell adicional y un proceso adicional). En el 99% de los casos, usar cat al comienzo de la tubería sin concatenar múltiples archivos es simplemente dañino. :)cat
, aunque inútil en este caso, facilitaría la edición de toda la línea de comandos en el futuro en caso de que desee cambiar / agregar / eliminar algo más tarde, tal vez atr
ocut
, etc., no tenga que buscar y mover el nombre de archivo , asegúrese de que el otro comando lo admita, busque dónde colocarlo, etc. Y para un pequeño archivo de prueba solo agrega 0.002s. (Probablemente he pasado más tiempo escribiendo esto de lo que ahorraré en toda una vida evitando lo superfluocat
)cat
ayuda aquí? Puedes hacerlogrep foo file | tr
o... | cut
tan fácilmente comocat file | tr | grep ...
. Elcat
solo agrega cinco caracteres adicionales, una tubería adicional y una llamada de programa adicional y no simplifica nada.Respuestas:
Si tu puedes hacerlo. Tu comando sería:
que solo devolvería:
El
awk
comando usa separadores de campo con el-F
comando, y para configurarlo para usar comillas dobles, lo escribe con comillas simples alrededor-F'"'
. Luego,'{print $2}'
le dice a awk que imprima el segundo conjunto después del separador de campo.¡Espero que esto ayude!
fuente
cat
ygrep
. Podrías reemplazarcat
y partirgrep
conawk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic
. Menos fontanería, dejando que AWK haga todo el trabajo, que es más que capaz de hacerawk
comando. =)Puedes hacerlo con un solo
grep
comando:O (un poco más largo y más convulsionado):
-P
: le dicegrep
que interprete el patrón como PCRE (expresión regular compatible con Perl);-o
: le dicegrep
que imprima solo la coincidencia;^CONFIG_ARCH_DEFCONFIG="
: coincide con unaCONFIG_ARCH_DEFCONFIG="
cadena al comienzo de la línea;\K
: descarta la subcadena previamente coincidente;# 1:
[^"]*
: coincide con cualquier número de cualquier carácter que no sea"
(con avidez).# 2:
.*?
: coincide con cualquier número de cualquier personaje (perezosamente);(?=")
: lookahead (aserción de longitud cero, no coincide con ningún carácter); coincide si el siguiente carácter es a"
.fuente
Hay muchas maneras de desollar a este gato, aquí hay una
sed
manera:Aquí estamos haciendo coincidir la línea y capturando la porción deseada, es decir, la porción entre comillas dobles (
([^"]+)
) y luego reemplazando toda la línea con el grupo capturado (\1
) solamente.Ejemplo:
fuente
Qué, no hay
perl
?El
perl
se-p
rint cada línea después de aplicar la secuencia de comandos dada por-e
. Las/foo/bar/
sustituiráfoo
conbar
. Los patrones entre paréntesis se "capturan" y pueden denominarse$1
,$2
...$N
donde$1
se captura el primer patrón,$2
el segundo, etc. La expresión regular buscará todo hasta la primera cita (.*?"
), luego capturará 0 o más"
caracteres que no sean caracteres. ([^"]*
) y luego todo lo demás. Todo se reemplaza con el patrón capturado.También puede dejar que el patrón coincida con
perl
:fuente
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]
Aquí hay una combinación de
grep
ycut
, que hace el mismo trabajo.Explicación:
grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic
es la parte que se encuentra la línea, en la sintaxis estándar grep:grep [OPTIONS] PATTERN [FILE...]
. La salida pasa por la tubería a la siguiente etapa.cut -d"\"" -f2
. Esta parte utiliza texto cortado a recortado separado por un delimitador específico (que se especifica con una-d
marca). Tenemos que escapar de la comilla doble con barra invertida para que el shell permita tomar comillas dobles como una de las opciones delcut
comando, en lugar de ingresarlo en el shell. Ahoracut
va a tratar de salida degrep
como separadas por"
y se dividió en tres columnas,CONFIG_ARCH_DEFCONFIG
,arch/x86/configs/x86_64_defconfig
, y el espacio vacío. La línea que necesitamos es la segunda columna, lo que significa que necesitamos usar-f2
flag.fuente
Como actualmente estoy aprendiendo
python
aquí, hay una versión que usa exactamente eso.Ejecución de muestra:
fuente
line.startswith
porquere.match
es mucho más lento questartswith