Pregunta

Para procesar un montón de datos y prepararlo para insertarlo en nuestra base de datos, generamos un montón de scripts de shell. Cada uno de ellos tiene aproximadamente 15 líneas, una para cada tabla a la que van los datos. Un lote de importación reciente, algunos de los archivos de importación fallaron al entrar en una tabla en particular. Entonces, tengo un montón de scripts de shell (alrededor de 600) donde necesito comentar las primeras 7 líneas, luego volver a ejecutar el archivo. Hay alrededor de 6000 scripts de shell en esta carpeta, y nada sobre un archivo en particular puede decirme si necesita la edición. Tengo una lista de los archivos que extraje de la salida de la base de datos.

Entonces, ¿cómo escribo un script bash (o cualquier otra cosa que funcione mejor) para tomar esta lista de nombres de archivos y para cada uno de ellos, comentar las primeras 7 líneas y ejecutar el script?

EDITAR:

#!/usr/bin/env sh

cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8

No estoy seguro de lo legible que es eso. Básicamente, las primeras 7 líneas (sin contar la primera línea) necesitan tener un # agregado al comienzo de ellas. Nota: los archivos se han editado para acortar cada línea y cortar parcialmente la copia de VIM. Pero en la parte principal de cada archivo, hay una línea que comienza con echo, luego una línea que comienza con sqlldr

¿Fue útil?

Solución

Usando sed, puede especificar un rango de número de línea en el archivo que se va a cambiar.

#!/bin/bash

while read line
do
    # add a comment to beginning of lines 1 - 7 and rename the script
    sed '3,9 s/^/#/' $line > $line.new
    exec $line.new
done < "filelist.txt"

Es posible que desee probar esto antes de ejecutarlo en todos esos scripts ...

EDITAR: cambió los números de las líneas para reflejar los comentarios.

Otros consejos

Hablando en términos generales:

#!/bin/sh
for file in "$@"
do
    out=/tmp/$file.$
    sed '2,8s/^/#/' < $file > $out
    $SHELL $out
    rm -f $out
done

Suponiendo que no te importa comprobar las condiciones de carrera, etc.

ex parece hecho para lo que quieres hacer.

Por ejemplo, para editar un archivo, con un documento aquí:

#!/bin/sh

ex test.txt << END
1,12s/^/#/
wq
END

Eso comentará las primeras 12 líneas en " test.txt " ;. Para su ejemplo, puede probar " $ FILE " o similar (¡incluyendo comillas!).

Luego ejecútelos de la forma habitual, es decir, ./"$FILE"

editar: $ SHELL " $ FILE " es probablemente un mejor enfoque para ejecutarlos (desde uno de los comentaristas anteriores).

Finalmente, querrás usar el comando linux sed. Cualquier lógica que necesite colocar en el guión, ya lo sabe. Pero su script finalmente llamará sed. http://lowfatlinux.com/linux-sed.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top