Supprimer les caractères de fin de ligne de la sortie standard? Plusieurs lignes en une seule ligne

14

J'ai un script qui produit le texte suivant. Il s'agit de la sortie d'un modem 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

Comment supprimer le caractère de fin de ligne pour chaque ligne? Je voudrais que la sortie ressemble à ceci (oui, c'est moche):

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 

J'ai essayé des solutions comme celle-ci, mais elles ne fonctionnent pas:

# (This simply outputs the contents of the script, unmodified)
stefanl@hosta:~/Work/Cacti $ ./script | sed -e 's/$//'

J'ai aussi essayé d'utiliser tr. Je m'attendais à ce que la commande suivante remplace chaque caractère de nouvelle ligne par le caractère espace. Cela prendrait les multiples lignes et les combinerait en une seule longue ligne. Au lieu de cela, cela n'affiche que la dernière ligne de sortie. Il semble remplacer chaque ligne suivante par la ligne de sortie suivante.

stefanl@hosta:~/Work/Cacti $ ./script | tr '\n' ' '
Data Rate:                    2880        1024stefanl@hosta:~/Work/Cacti $
stefanl@hosta:~/Work/Cacti $

Mise à jour :

Après un examen plus approfondi, il semble que chaque ligne soit précédée d'un caractère de retour. Cela apparaît comme ^Mlors de l'utilisation less. J'ai donc ajouté deux trdéclarations. Un pour supprimer les caractères de nouvelle ligne, un pour supprimer le caractère de retour.

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

Réponses:

18

sedne fonctionnera pas (facilement) car il fonctionne sur les lignes une à la fois; vous pouvez le faire, mais cela impliquerait de copier toute l'entrée dans le tampon de maintien

trdevrait en fait fonctionner comme vous l'avez collé; êtes-vous sûr que les nouvelles lignes sont \ns? Vous pouvez le simplifier un peu en supprimant les sauts de ligne au lieu de les convertir en espaces:

tr -d '\n'
Michael Mrozek
la source
Les deux tr '\n' ' 'et tr -d '\n' envelopperont la ligne d'une manière étrange. J'ai mis à jour ma question pour afficher les résultats. Donc, je dois peut-être utiliser tr, mais j'ai juste besoin de comprendre comment l'utiliser correctement.
Stefan Lasiewski
Pourriez-vous développer ce qui est bizarre? La raison pour laquelle votre invite se retrouve sur la même ligne que la dernière ligne de sortie est précisément parce que vous avez supprimé le «\ n» à la fin de la ligne. Si vous décrivez le résultat final que vous recherchez, je suis sûr que quelqu'un trouvera le filtre approprié.
Steven D
Ok, je suppose que je pourrais être plus clair. J'espérais envelopper ces plusieurs lignes en une seule ligne. Je m'attendrais tr '\n' ' 'à supprimer le caractère de nouvelle ligne et à le remplacer par un caractère d'espace, et donc à avoir une longue ligne.
Stefan Lasiewski
@Steven: J'ai mis à jour ma question pour discuter de ce que j'attendais à voir et de ce qui était réellement imprimé à l'écran.
Stefan Lasiewski
Hmm. Sauf si votre sortie n'est pas terminée avec \ n, cela devrait vous donner la sortie que vous attendez. Avez-vous essayé de le canaliser dans un fichier, puis de confirmer que l'habillage de ligne n'est pas quelque chose que votre terme fait pour vous?
Steven D
5

en plus tr, quelques autres méthodes que vous pouvez utiliser

awk

awk '1' ORS= file

coquille

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

sed

sed -e ':a' -e 'N;s/\n/ /;ba' file
user1606
la source
0

Permet tr -s '\n'de remplacer des séquences de caractères de saut de ligne répétés par une seule occurrence de saut de ligne.

Exemple:

>>> 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

(voir man tr)

Franck
la source
0

Pour supprimer les caractères de nouvelle ligne, c'est tr -d '\n' < file. Cependant, pour joindre toutes les lignes, c'est paste -sd '\0' file.

tr -d '\n' produit une sortie non textuelle car elle ne termine pas la ligne avec un caractère de nouvelle ligne.

Pour supprimer, tous les caractères CR, vous pouvez faire:

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

Pour supprimer uniquement les caractères CR qui se trouvent à la fin des lignes:

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

Ou utilisez awkpour tout:

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

Ou utilisez dos2unix(ce qui supprimerait ces CR de fin et résoudrait également certains autres problèmes avec les fichiers texte des systèmes d'exploitation Microsoft):

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