grep 'potato:' file.txt | sed 's/^.*: //'
grep
busca cualquier línea que contenga la cadena potato:
, luego, para cada una de estas líneas, sed
reemplaza ( s///
- sustituye) cualquier carácter ( .*
) desde el principio de la línea ( ^
) hasta la última aparición de la secuencia :
(dos puntos seguidos de un espacio) con el vacío cadena ( s/...//
- sustituya la primera parte por la segunda, que está vacía).
o
grep 'potato:' file.txt | cut -d\ -f2
Para cada línea que contiene potato:
, cut
dividirá la línea en varios campos delimitados por espacio ( -d\
- d
= delimitador, \
= carácter de espacio de escape, algo como -d" "
también habría funcionado) e imprimirá el segundo campo de cada una de esas líneas ( -f2
).
o
grep 'potato:' file.txt | awk '{print $2}'
Para cada línea que contenga potato:
, awk
imprimirá el segundo campo ( print $2
) que está delimitado por defecto por espacios.
o
grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'
Todas las líneas que contienen potato:
se envían a un script de Perl en línea ( -e
) que toma todas las líneas de , luego, para cada una de estas líneas, hace la misma sustitución que en el primer ejemplo anterior y luego las imprime.stdin
o
awk '{if(/potato:/) print $2}' < file.txt
El archivo se envía vía stdin
( < file.txt
envía el contenido del archivo vía stdin
al comando de la izquierda) a un awk
script que, para cada línea que contiene potato:
( if(/potato:/)
devuelve verdadero si la expresión regular /potato:/
coincide con la línea actual), imprime el segundo campo, como se describe encima.
o
perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt
El archivo se envía mediante stdin
( < file.txt
, ver arriba) a un script Perl que funciona de manera similar al anterior, pero esta vez también se asegura de que cada línea contenga la cadena potato:
( /potato:/
es una expresión regular que coincide si la línea actual contiene potato:
, y, si lo hace ( &&
), luego procede a aplicar la expresión regular descrita anteriormente e imprime el resultado).
awk '$1 ~ /potato/ { print $2 }' file.txt
.awk '/potato:/ {print $2}'
perl -pe
O use afirmaciones de expresiones regulares:
grep -oP '(?<=potato: ).*' file.txt
fuente
-o
significa imprimir solo la parte correspondiente de la línea. Considerando que-P
infiere una expresión regular compatible con Perl, que resulta ser una expresión regular de búsqueda posterior positiva(?<=string)
.Uno puede pensar en Grep como un Sed restringido, o en Sed como un Grep generalizado. En este caso, Sed es una herramienta buena y liviana que hace lo que quiere, aunque, por supuesto, también existen otras formas razonables de hacerlo.
fuente
Esto imprimirá todo después de cada partido, solo en la misma línea:
Esto hará lo mismo, excepto que también imprimirá todas las líneas siguientes:
Se utilizan estas opciones de la línea de comandos:
-n
bucle alrededor de cada línea del archivo de entrada-l
elimina las nuevas líneas antes del procesamiento y las vuelve a agregar después-e
ejecutar el código perlfuente
-P
usar expresiones regulares de Perl-o
para generar solo el partido\s
para que coincida con el espacio despuéspotato:
\K
omitir el partido.*
para que coincida con el resto de la (s) cadena (s)fuente
Puede usar grep, como dicen las otras respuestas. Pero no necesita grep, awk, sed, perl, cut ni ninguna herramienta externa. Puedes hacerlo con puro bash.
Pruebe esto (los puntos y comas están ahí para permitirle ponerlo todo en una línea):
## le dice a bash que elimine la coincidencia más larga de ":" en $ line desde el frente.
o si desea la clave en lugar del valor, %% le dice a bash que elimine la coincidencia más larga de ":" en $ línea desde el final.
La subcadena para dividir es ": \" porque el carácter de espacio debe escaparse con la barra invertida.
Puede encontrar más como estos en el proyecto de documentación de Linux .
fuente
while read
es extremadamente lento; usar una utilidad externa será mucho más rápido siempre que elija una con E / S con búfer (es decir, prácticamente cualquiera de los mencionados en esta respuesta y muchos otros).read -r
menos que necesite de manera muy específica algún comportamiento heredado bastante molesto antes de POSIX.BASH moderno tiene soporte para expresiones regulares:
while read -r line; do if [[ $line =~ ^potato:\ ([0-9]+) ]]; then echo "${BASH_REMATCH[1]}" fi done
fuente