GREP для содержимого после шаблона в разделителе

Что ж, давайте разобьем это на простые шаги:

#!/bin/bash

# First, let's get that file's name:
FILE=$(ls -rt ORIGFILE*.txt | tail -n1)
if [[ 0 -ne $? ]]; then
    echo "Unable to locate matching file.  Aborting." 1>&2
    exit 1
fi

# Now, create a new file containing the file's name:
echo "$FILE" > NEWFILE.TXT

# And append the contents of the old file into the new:
cat "$FILE" >> NEWFILE.TXT

# Finally, get rid of the old file: (uncomment if you're sure)
# rm "$FILE"
2
04.06.2018, 12:49
4 ответа
$ sed 's/[^|]*modesc=\([^ ]*\).*$/\1/' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Esto usa sedpara reemplazar todo el último campo con el contenido después de modesc=hasta el siguiente espacio.


$ awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(".*", "", $3)} 1' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

Este awkprograma modifica la tercera columna con dos sustituciones. El primero elimina todo hasta modesc=inclusive, y el segundo elimina todo después del primer espacio restante. El solitario 1al final hará que awkimprima el registro modificado (que puede ser reemplazado por{ print }).


Para solo obtener la cadena después de modesc=de la tercera columna de los datos originales (y nada más ), puede usar cualquiera de los comandos anteriores y luego canalizarlo cut -d '|' -f3, o puede usar

sed 's/.*modesc=\([^ ]*\).*$/\1/' file

o

awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(".*", "", $3); print $3 }' file
1
27.01.2020, 22:09

Usandoawk:

awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*).*$/,"\\1","g",$3)}' /tmp/file.log
0
27.01.2020, 22:09

Con awkpuede usar delimitadores de multiplicación y hacerlo bastante muestra:

awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log

En la tubería de línea anterior |, el signo de equivalencia =y el espacio son ​​delimitadores.

Puede definir el delimitador de salida explícitamente así:

awk -F'[|= ]' 'BEGIN { OFS="|"}  {print $1,$2,$5}' /tmp/file.log
1
27.01.2020, 22:09

Esto será menos eficiente, pero la tarea encaja muy bien con cutypaste

paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')
0
27.01.2020, 22:09

Теги

Похожие вопросы