buscar un archivo y crear un nuevo archivo solo si se cumple una condición

10

Tengo un archivo de registro y quiero buscar una cadena y solo si esa cadena encuentra un nuevo archivo para crear. ¿Cómo puedo lograr esto? Sed doenst parece encajar en este caso.

Jacknife
fuente
3
Use greppara buscar. La -qopción suprimirá todos los resultados y devolverá la coincidencia / no coincidencia a través grepdel código de salida, que es fácilmente comprobable.
waltinator
2
Puede ser útil decirnos cuál es la condición.
j0h

Respuestas:

16

Haga una evaluación de cortocircuito después de grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qno produce salida en STDOUT, solo sale con estado de salida 0si el patrón se encuentra en el archivo

  • Si se encuentra el patrón ( &&), cree un archivo /newfilepor : >/newfile.


También podría optar por el touch /newfileenfoque habitual , o en bashuna redirección vacía, también >/newfilelo haría.

Solo para tener en cuenta, si el archivo ya existe, entonces touchsolo cambiaría las marcas de tiempo relevantes sin truncar el archivo. Y la redirección vacía >/newfileno se admite en todos los shells sobre la marcha (por ejemplo, en zsh), donde debe enviar manualmente el EOF.

heemayl
fuente
¿Qué hace el :?
George Udosen
55
@George :es la abreviatura de true, es un comando no operativo que siempre sale con el estado de salida 0.
heemayl
@heemayl Esto funcionó mejor hasta el día de hoy
Jacknife
6

Solo por diversión:

python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"

donde 'string'se reemplaza por la cadena (condición), 'logfile'se reemplaza por la ruta al archivo de registro, 'newfile'se reemplaza por la ruta real al archivo a crear, todo entre comillas simples, probablemente en el ejemplo.

Jacob Vlijm
fuente
4

Puedes usar awk con su system()comando. Si /pattern/se encuentra el, el bloque de código {}se ejecutará, en este caso llamaremos a touch /tmp/my_file.txttravés del system()comando.

El siguiente ejemplo muestra la creación de un archivo temporal si hay mi usuario presente /etc/passwd.

$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd

$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月  25 07:58 /tmp/my_file.txt

Alternativamente, podríamos usar la redirección al archivo:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 
Sergiy Kolodyazhnyy
fuente
0

No dice si desea un nuevo archivo vacío o si necesita un procesamiento más complejo para crear el archivo.

Si es lo primero, la respuesta de @heemayl es acertada.

De lo contrario, use una instrucción if:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
Paddy Landau
fuente