Comment supprimer la fin du texte en shell

comment supprimer la fin du texte:

SRC=186.215.60.39 DST=91.122.100.104 LEN=41 PROTO=UDP SPT=56796 DPT=26000 LEN=21 SRC=111.241.136.139 DST=91.122.100.104 LEN=52 DF PROTO=TCP SPT=4369 DPT=25 SRC=79.255.158.211 DST=91.122.100.104 LEN=48 PROTO=TCP SPT=50745 DPT=21 SEQ=1769809304 SRC=200.35.96.235 DST=91.122.100.104 LEN=40 SPT=6000 DPT=3306 SEQ=96534528 ACK=0

de façon a obtenir:

[code]SRC=186.215.60.39 DST=91.122.100.104 LEN=41 PROTO=UDP SPT=56796 DPT=26000 LEN=21
SRC=111.241.136.139 DST=91.122.100.104 LEN=52 DF PROTO=TCP SPT=4369 DPT=25
SRC=79.255.158.211 DST=91.122.100.104 LEN=48 PROTO=TCP SPT=50745 DPT=21
SRC=200.35.96.235 DST=91.122.100.104 LEN=40 SPT=6000 DPT=3306

[/code]
il s’agit de suprimer: SEQ= ? et ACK= ?
mai vu que la fin change sans arrêt et que je maîtrise ni awk ni sed …

j’utilise ulog pour les log d’iptables et je voudrai juste filtrer ce qui m’interesse:

j’ai tenter avec un cat /var/log/ulog/syslogemu.log |cut -d" " -f10- |cut -d" " -f1,2,3,4,10,11,12,13,13| sed 's/\(*\)SEQ/\test/'
mai non c’est pas sa .
merci d’avance

Ca remplace "espace SEQ= un nombre" par rien et pareil pour ACK.

Ca remplace “espace SEQ= un nombre” par rien et pareil pour ACK.

bonjour,

étant donné qu’il y a de la récurrence, sed est le moins adapté

awk ' { while ($NF ~ /SEQ=|ACK=/) { $NF=""; NF--  } {print } }' <<EOF
> SRC=186.215.60.39 DST=91.122.100.104 LEN=41 PROTO=UDP SPT=56796 DPT=26000 LEN=21
> SRC=111.241.136.139 DST=91.122.100.104 LEN=52 DF PROTO=TCP SPT=4369 DPT=25
> SRC=79.255.158.211 DST=91.122.100.104 LEN=48 PROTO=TCP SPT=50745 DPT=21 SEQ=1769809304
> SRC=200.35.96.235 DST=91.122.100.104 LEN=40 SPT=6000 DPT=3306 SEQ=96534528 ACK=0
> EOF
SRC=186.215.60.39 DST=91.122.100.104 LEN=41 PROTO=UDP SPT=56796 DPT=26000 LEN=21
SRC=111.241.136.139 DST=91.122.100.104 LEN=52 DF PROTO=TCP SPT=4369 DPT=25
SRC=79.255.158.211 DST=91.122.100.104 LEN=48 PROTO=TCP SPT=50745 DPT=21
SRC=200.35.96.235 DST=91.122.100.104 LEN=40 SPT=6000 DPT=3306

attention, ce code est basé sur le fait que ACK ou SEQ sont en dernière colonne

EDIT : suivant les versions de awk $NF="" peut être omis

Pourquoi donc ? Il traite toutes les lignes l’une après l’autre. Le code est plus simple et pose moins d’hypothèse que ta version awk.

parce que je ne sais pas si l’ordre de ‘SEQ puis ACK’ (qui doivent se trouver en fin de ligne si j’ai bien compris) est toujours dans ce sens.
mais tout cela dépend d’informations que l’on ne possède pas et de notre interprétation de la demande :wink:

[quote=“Totor”]parce que je ne sais pas si l’ordre de ‘SEQ puis ACK’ (qui doivent se trouver en fin de ligne si j’ai bien compris) est toujours dans ce sens.
mais tout cela dépend d’informations que l’on ne possède pas et de notre interprétation de la demande :wink:[/quote]
Peut être as-tu mal lu ma commande sed ? Il y a deux expressions qui sont indépendante l’un de l’autre. Il y a deux contraintes dans mon code :
[ul]
[li]aucun des deux ne doit être en première position[/li]
[li]ils doivent être suivi par des entiers naturels[/li][/ul]
On peut lever ces deux limitations ainsi, je pense :

:open_mouth:
ça me parait bien compliqué !

bon, si tu tiens à sed :

sed -r 'e: s/ (SEQ|ACK)=[0-9]+$//; t e' <<EOF
SRC=186.215.60.39 DST=91.122.100.104 LEN=41 PROTO=UDP SPT=56796 DPT=26000 LEN=21
SRC=111.241.136.139 DST=91.122.100.104 LEN=52 DF PROTO=TCP SPT=4369 DPT=25
SRC=79.255.158.211 DST=91.122.100.104 LEN=48 PROTO=TCP SPT=50745 DPT=21 SEQ=1769809304
SRC=200.35.96.235 DST=91.122.100.104 LEN=40 SPT=6000 DPT=3306 SEQ=96534528 ACK=0
EOF

par contre, la version de sed que j’ai à dispo ne gère pas les ERE (mais simplement les ER). je ne peux donc garantir cette syntaxe (je testerai une fois rentrée chez moi ce soir)

ça me parait bien compliqué ![/quote]
Tu as bien raison, je suis allé vite.

quote="Totor"bon, si tu tiens à sed :

sed -r 'e: s/ (SEQ|ACK)=[0-9]+$//; t e' <<EOF SRC=186.215.60.39 DST=91.122.100.104 LEN=41 PROTO=UDP SPT=56796 DPT=26000 LEN=21 SRC=111.241.136.139 DST=91.122.100.104 LEN=52 DF PROTO=TCP SPT=4369 DPT=25 SRC=79.255.158.211 DST=91.122.100.104 LEN=48 PROTO=TCP SPT=50745 DPT=21 SEQ=1769809304 SRC=200.35.96.235 DST=91.122.100.104 LEN=40 SPT=6000 DPT=3306 SEQ=96534528 ACK=0 EOF [/quote]
Par contre ta version est complexe encore on peut faire la même chose ainsi :

Je l’ai vérifié sur :

GNU sed version 4.1.5 Copyright (C) 2003 Free Software Foundation, Inc. Ce logiciel est libre; voir les sources pour les conditions de reproduction. AUCUNE garantie n'est donnée; y compris pour des RAISONS COMMERCIALES ou pour RÉPONDRE A UN BESOIN PARTICULIER, à l'étendue permise par la loi.

merci pour la vérif.
l’étiquette et le branchement conditionnel ne sont effectivement pas nécessaire. Mais la version de sed que j’utilise sur AIX n’est pas récursive et j’avais dû les utiliser. C’est pourquoi je les avais laisser :

:e
s/ SEQ=[0-9]\{1,\}$//
s/ ACK=[0-9]\{1,\}$//
t e

merci pour les précisions.

D’ailleurs j’ai oublié de dire mais ma version compliquée, l’était surtout à cause des espaces dans les cas où ACK ou SEQ peuvent être en début de ligne comme en fin.

Merci pour vos réponse

voila le code utiliser (bon je suis débutant en shell)

sed -r 's/ (SEQ|ACK)=[0-9]+//g'

et sa donne:

cat /var/log/ulog/syslogemu.log |cut -d" " -f10- |cut -d" " -f1,2,3,4,10,11,12,13,13 |sed -r 's/ (SEQ|ACK)=[0-9]+//g'

Merci beaucoup
pour les débutant sa permet d’afficher les log d’iptables, mai pour être précis il s’agis du
paquet ulogd (ou ulog), sa permet juste de séparer les entrée dans un fichier séparer 8)

Edit: j’ai vu qu’il manquait 2 ou 3 petite chose :laughing:

cat /var/log/ulog/syslogemu.log |cut -d" " -f10- |cut -d" " -f1,2,3,4,9,10,11,12,13,14 |sed -r 's/ (SEQ|ACK)=[0-9]+//g' |sed "s/\PROTO=//g" |sed "s/\DF//g" |sed "s/\CE//g" |sed -r 's/ (WINDOW)=[0-9]+//g' |sed "s/\ \ */\ /g" |sort