linux - usar - grep para contenido DESPUÉS del patrón
usar grep (5)
Esto imprimirá todo después de cada partida, solo en la misma línea:
perl -lne ''print $1 if /^potato:/s*(.*)/'' file.txt
Esto hará lo mismo, excepto que también imprimirá todas las líneas siguientes:
perl -lne ''if ($found){print} elsif (/^potato:/s*(.*)/){print $1; $found++}'' file.txt
Estas opciones de línea de comando se usan:
-
-n
bucle alrededor de cada línea del archivo de entrada -
-l
elimina las nuevas líneas antes del procesamiento y las agrega de nuevo en adelante -
-e
ejecuta el código perl
Dado un archivo, ejemplo:
potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789
Me gustaría buscar todas las líneas que comiencen con potato:
pero solo pipe los números que siguen a Potato
. Entonces, en el ejemplo anterior, la salida sería:
1234
5432
¿Cómo puedo hacer eso?
O use las aserciones de grep -oP ''(?<=potato: ).*'' file.txt
regulares: grep -oP ''(?<=potato: ).*'' file.txt
Puedes usar grep, como las otras respuestas dicen. Pero no necesitas grep, awk, sed, perl, cut o cualquier herramienta externa. Puedes hacerlo con pure bash.
Pruebe esto (los puntos y comas están ahí para permitirle poner todo en una línea):
$ while read line;
do
if [[ "${line%%:/ *}" == "potato" ]];
then
echo ${line##*:/ };
fi;
done< file.txt
## le dice a bash que elimine la coincidencia más larga de ":" en $ line desde el frente.
$ while read line; do echo ${line##*:/ }; done< file.txt
1234
5678
5432
4567
5432
56789
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.
$ while read line; do echo ${line%%:/ *}; done< file.txt
potato
apple
potato
grape
banana
sushi
La subcadena en la que se divide es ": /" porque el carácter de espacio se debe escapar con la barra invertida.
Puede encontrar más como estos en el proyecto de documentación de Linux .
grep ''potato:'' file.txt | sed ''s/^.*: //''
o
grep ''potato:'' file.txt | cut -d/ -f2
o
grep ''potato:'' file.txt | awk ''{print $2}''
o
grep ''potato:'' file.txt | perl -e ''for(<>){s/^.*: //;print}''
o
awk ''{if(/potato:/) print $2}'' < file.txt
o
perl -e ''for(<>){/potato:/ && s/^.*: // && print}'' < file.txt
sed -n ''s/^potato:[[:space:]]*//p'' file.txt
Uno puede pensar en Grep como un Sed restringido, o de Sed como un Grep generalizado. En este caso, Sed es una herramienta buena y liviana que hace lo que usted desea, aunque, por supuesto, existen otras formas razonables de hacerlo también.