grep cambiando el delimitador


12

¿Podemos cambiar el delimitador que usa grep?

Creo que, por defecto, grep usa \ncomo delimitador.


Parece que sería más adecuado en SuperUser.com
— Mitch Dempsey

Lea la página de manual, vea si existe esa opción (no, no creo que la haya).
— Cascabel

Ya lo he leido. y no, no hay opción

@jhon: Entonces no preguntes cómo cambiar grep, pregunta cómo hacer lo que quieres hacer con otra cosa. Por ejemplo, puede especificar el separador de registros en perl ( $/) y awk ( RS). O podrías hacer algo así echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Muchas respuestas, dependiendo de cuál sea su problema real.
— Cascabel

Respuestas:


2

Si le importa la salida, trpodría funcionar para usted:

che@nok ~ $ grep cpu /proc/cpuinfo | tr '\n' ';'
cpu family      : 6;cpu MHz             : 800.000;cpu cores     : 2;cpuid level : 10;cpu family : 6;cpu MHz : 800.000;cpu cores      : 2;cpuid level : 10;

en realidad, tengo un montón de datos como este, almacenados dentro de una variable: algo xxxxx aaaaa @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ entonces, estaba adivinando si era posible: echo $ my_var | grep "algo" funciona, pero no como yo quiero, grep toma el conjunto de datos como una sola línea, es por eso que quiero cambiarlo a un carácter específico (aquí está '@')

Entonces es posible que trate de poner de esta manera:echo $my_var | tr @ '\n' | grep blahblah
— che

Lo he hecho, pero parece que el shell está "intentando" ejecutar el contenido: S

2
$my varDebe citar la variable para preservar espacios en blanco y líneas nuevas, es decir echo "$my_var" | ....
— mrucci

1

agrepde la Universidad de Arizona le permite establecer el delimitador. No es un reemplazo directo para grep; utiliza un algoritmo diferente (grep aproximado, puede coincidir con errores) y tiene una sintaxis de patrón diferente. Pero es una herramienta útil.

Desafortunadamente, creo que debido a problemas de licencia, se han llamado varios proyectos similares agrep, y no todos son compatibles. Pero creo que todas las versiones le permiten establecer un delimitador.


1
case $# in
0|1|2)  cat >&2 <<EOF
    Usage: $0 delimiterstring pattern files....
    Behaves like grep -pdelimiterstring but on linux
    DOES NOT SUPPORT MOST ARGUMENTS
    unlike grep -p - leaves delimiterstring in output

    NO -p just the delimeterstring
    note: delimiterstring has to work in the sed command where the ${d} is
    if you are going to use @ in the delimeter string, then the @'s
    need to be replaced by someother character

EOF
    exit 0
;;
3)  mode=one ;;
*)  mode=many ;;
esac
d="${1}"
p="${2}"
shift 2
while [ $# -gt 1 ]
do
    sed "s@${d}@\x00@g" "${1}" | grep -z  "${p}" -  | (
        case $mode in 
        many) sed -e "s@\x00@${d}@g"  -e "s@^@${1}: @" ;;
        *)    sed -e "s@\x00@${d}@g"  ;;
        esac
    )
    shift
done

1
(1) Si bien esto puede resolver el problema, preferimos que las respuestas tengan un poco más de explicación. Por ejemplo, ¿hay alguna razón real para decir en d="${1}"lugar de solo d="$1"? (2) Debe expandir su advertencia: si se usa con varios archivos, también tiene un problema si alguno de los nombres de archivo contiene '@'. (3) (Selección de Nit) Un verdadero reemplazo / emulador "grep" también funcionaría con cero argumentos de archivo.
— Scott

1

Reemplace el delimitador cero ('@') con una nueva línea (\ n) antes de grep:

archivo de gato | tr '\ 00' '\ n' | grep "cadena de búsqueda"


0

Cómo es esto ? Cualquier uso?

archivo grep "cadena de búsqueda" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Establezca '@' a lo que se adapte a sus necesidades.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.