Comportamiento peculiar de la tubería/cabezal

Comportamiento peculiar de la tubería/cabezal

Estoy ayudando al administrador de red aquí con una expresión regular de Perl para automatizar la operación en algunas instantáneas de nuestra SAN y nuestros scripts hacen cosas como esta:

varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$1/')

varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$2/')

Hay dos partes en la firma de la instantánea, una anidada en la otra y estamos usando los grupos de captura para capturar el nombre y una parte del nombre para diferentes comandos posteriores que deben ejecutarse. Sé que está ejecutando el mismo comando una y otra vez, y la expresión regular se puede limpiar más tarde, pero básicamente están usando perl para generar uno de los pares y el otro.

tcp: [32] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
tcp: [33] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1

Queriendo capturar de lo que fue el resultado del icsiadm y grep para obtener esto:

iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1

y

r12prd-rbmsdata1-2012-06-29-16:07:40.108.1

El problema que tenemos es que a veces la tubería que va a la primera línea falla con:

head: cannot open '–n1' for reading: No such file or directory

Por supuesto, esto parece indicar que la entrada estándar del encabezado está vacía, por lo que está buscando un nombre de archivo.

Pero no hay razón para que alguna vez esté vacío.

Si hacemos cosas como esta:

varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)

el segundo fallará y la segunda variable estará vacía.

Sin embargo, si los revertimos, varsnap1 fallará:

varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)

Es muy peculiar y no podemos entender qué está pasando. El comando iscsiadm devuelve lo mismo en cada ejecución cuando lo ejecutamos desde la línea de comandos y después de realizar grepping.

¿Hay algo que esté estropeando la tubería?

versión principal 5.97 en RedHat Enterprise Linux

Respuesta1

Si bien su pregunta puede contener un error (guión utf8 largo en lugar del normal):

$ head –n1
head: cannot open ‘–n1’ for reading: No such file or directory
$ head -n1 # ctrl-d
$ 

Supuse que era sólo una cuestión del navegador, ya que sólo una ocurrencia fue así. headespera entrada cuando la necesita de todos modos. Intente reemplazarlo head -n1con uno de estos:

sed -n 1p
awk 'NR==1 {print}' # yay, no potential dash problems

Ok, hay muchas más formas de hacerlo, pero también puedes omitir ese elemento de tubería y simplemente indicar grepque se devuelva solo la primera coincidencia agregando el -m 1parámetro. O eliminar dos elementos y decirle perlque opere solo en la primera línea coincidente.

información relacionada