it-swarm-es.tech

¿Eliminar los caracteres de final de línea de la salida estándar? Varias líneas en una sola línea

Tengo un script que genera el siguiente texto. Esta es la salida de un módem Netopia 2210-02 ADSL2 .

ADSL Line State:        Up
ADSL Startup Attempts:  1
ADSL Modulation:        DMT
ADSL Data Path:         Fast
Datapump Version:       DSP 7.2.3.0, HAL 7.2.1.0
SNR Margin:                   8.20        9.00 dB
Line Attenuation:            57.50       31.00 dB
Output Power:                17.09       12.34 dBm
Errored Seconds:                 0           0
Loss of Signal:                  0         476
Loss of Frame:                   0           0
CRC Errors:                  57921         416
Data Rate:                    2880        1024

¿Cómo puedo eliminar el carácter de final de línea para cada línea? Me gustaría que la salida se viera así (Sí, es feo):

ADSL Line State:        Up ADSL Startup Attempts:  1 ADSL Modulation:        DMT ADSL Data Path:         Fast Datapump Version:       DSP 7.2.3.0, HAL 7.2.1.0 SNR Margin:                   8.20        9.00 dB Line Attenuation:            57.50       31.00 dB Output Power:                17.09       12.34 dBm Errored Seconds:                 0           0 Loss of Signal:                  0         476 Loss of Frame:                   0           0 CRC Errors:                  57921         416 Data Rate:                    2880        1024 

Probé algunas soluciones como esta, pero no funcionan:

# (This simply outputs the contents of the script, unmodified)
[email protected]:~/Work/Cacti $ ./script | sed -e 's/$//'

También intenté usar tr. Esperaba que el siguiente comando reemplazara cada carácter de nueva línea con el carácter de espacio. Esto tomaría las múltiples líneas y las combinaría en una sola línea larga. En cambio, esto solo muestra la última línea de salida. Parece sobrescribir cada línea subsiguiente con la siguiente línea de salida.

[email protected]:~/Work/Cacti $ ./script | tr '\n' ' '
Data Rate:                    2880        [email protected]:~/Work/Cacti $
[email protected]:~/Work/Cacti $

Actualización :

Tras un examen más detenido, parece que cada línea está precedida por un carácter de retorno. Esto se muestra como ^M cuando se usa less. Entonces, agregué dos declaraciones tr. Uno para eliminar caracteres de nueva línea, uno para eliminar el carácter de retorno.

./script | | tr -d '\n' | tr -d '\r'
15
Stefan Lasiewski

sed no funcionará (fácilmente) porque opera en las líneas una a la vez; podría hacerlo, pero implicaría copiar toda la entrada en el búfer de retención

tr en realidad debería funcionar de la forma en que lo pegó; ¿Estás seguro de que las nuevas líneas son \ns? Puede simplificarlo un poco eliminando las nuevas líneas en lugar de convertirlas en espacios:

tr -d '\n'
18
Michael Mrozek

además de tr, algunos otros métodos que puede utilizar

awk

awk '1' ORS= file

Cáscara

while read -r line; do printf "%s " "$line"; done <file

sed

sed -e ':a' -e 'N;s/\n/ /;ba' file
5
user1606

Utilizar tr -s '\n' para reemplazar secuencias de caracteres de nueva línea repetidos con una sola aparición de nueva línea.

Ejemplo:

>>> echo -e "Squeeze\n\n\nthose\n\n\n\nnewlines\n"
Squeeze


those



newlines

2z [franck:~] $ 
>>> echo -e "Squeeze\n\n\nthose\n\n\n\nnewlines\n" | tr -s '\n'
Squeeze
those
newlines

(ver man tr)

0
Franck

Para eliminar caracteres de nueva línea, es tr -d '\n' < file. Sin embargo, para unir todas las líneas, eso es paste -sd '\0' file.

tr -d '\n' produce una salida sin texto ya que no termina la línea con un carácter de nueva línea.

Para eliminar, todos los caracteres CR, puede hacer:

tr -d '\r' < file | paste -sd '\0' -

Para eliminar solo los caracteres CR que están al final de las líneas:

CR=$(printf '\r')
sed "s/$CR\$//" < file | paste -sd '\0' -

O use awk para todo:

awk '{gsub(/\r$/, ""); printf "%s", $0} 
     END {if (NR) print ""}' < file

O usar dos2unix (que eliminaría los CR finales y también solucionaría algunos otros problemas con los archivos de texto de los sistemas operativos de Microsoft):

 dos2unix < file | paste -sd '\0' -
0
Stéphane Chazelas