grep cambiando el delimitador

12

¿Podemos cambiar el delimitador que usa grep?

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

studiohack
fuente
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;
che
fuente
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.

Norman Ramsey
fuente
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
Kurt
fuente
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"

Franz Meyer
fuente
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.

usuario42723
fuente