Newsgroup: it.comp.os.linux.iniziare
Titolo: Iniziare con cat grep sed

Oggi mi son messa in testa di cominciare a capirci qualcosa di sed grep 
e espressioni regolari.
Per fare delle prove prendo syslog e cerco di avere, per esempio, solo 
l'output di iptables in un formato "ripulito".
Adesso vi faccio ridere: pronti?
per avere alla fine un output tipo:
Sep 17 12:08:28 : REJECTED  SRC=82.54.193.165 PROTO=TCP SPT=1264 DPT=445 
Sep 17 12:08:29 : REJECTED  SRC=82.54.193.165 PROTO=TCP SPT=1264 DPT=445 
Sep 17 12:08:30 : REJECTED  SRC=82.54.193.165 PROTO=TCP SPT=1264 DPT=445 
Sep 17 12:08:30 : REJECTED  SRC=82.54.221.137 PROTO=TCP SPT=2321 DPT=445 
Sep 17 12:08:30 : REJECTED  SRC=82.54.221.137 PROTO=TCP SPT=2321 DPT=445 
Sep 17 12:08:31 : REJECTED  SRC=82.54.221.137 PROTO=TCP SPT=2321 DPT=445 
Sep 17 12:09:34 : DROPPED  SRC=82.54.152.250  PROTO=TCP SPT=2439 DPT=135 
Sep 17 12:09:37 : DROPPED  SRC=82.54.152.250  PROTO=TCP SPT=2439 DPT=135 
Sep 17 12:09:41 : DROPPED  SRC=82.54.133.98   PROTO=TCP SPT=1232 DPT=139 
Sep 17 12:09:44 : REJECTED  SRC=82.54.120.196 PROTO=TCP SPT=3142 DPT=445 
Sep 17 12:09:44 : DROPPED  SRC=82.54.133.98   PROTO=TCP SPT=1232 DPT=139 
Sep 17 12:09:46 : REJECTED SRC=203.79.96.43 PROTO=TCP SPT=63995 DPT=3982 
la mia mente malata ha creato:
cat /var/log/syslog
| grep -v "192.168.1.1"
| grep "Sep 17 12:"
| sed 's/(none) kernel//'
| sed 's/MAC="mioMAC"//'
| sed 's/REJECTED IN=eth0 OUT=//'
| sed 's/ACK=0//'
| sed 's/LEN=[0-9]*//'
| sed 's/TOS=\w*//'
| sed 's/PREC=\w*//'
| sed 's/DF PROTO=TCP//'
| sed 's/RES=[0-9]*//'
| sed 's/SYN URGP=0//'
| sed 's/OPT (\w*)//'
| sed 's/DST="ilmioip"//'
| sed 's/TTL=[0-9]*//'
| sed 's/ WINDOW=[0-9]*//'
| sed 's/ID=[0-9]*//'
| sed 's/SEQ=[0-9]*//'
(ovviamente ho messo i ritorni a capo per lenderlo leggibile).
Poi ho provato a fare tail -f /var/log/syslog | grep "ecc ecc." ma 
ovviamente (da quello che ho supposto) mi arriva fino al primo grep che 
legge lo stdout di tail sul terminale ma poi evidentemente  essendo un 
pipe  blocca il buffer  e quindi il secondo grep e i successivi.
Da qui nasce spontanea la
Domanda 1: si poteva sostituire tutti i grep e i sed con un unico "sed"??
Come?? :-P
Sono impazzita per togliere "OPT (`un numero di cifre variabili`)"
Domanda 2: Come si fa a dire a sed: trova 
"OPT+unospazio+unaparentesiaperta+molte cifre+unaparentesichiusa"?
Ho provato con sed -r 's/OPT\s\([0-9]*\) in tutte le salse ma brancolavo 
ovviamente nel buio...
Abbiate pieta'
Laura

 Adesso vi faccio ridere: pronti?
direi che forse non è il newsgroup giusto. Lette le faq?
N.

 ovviamente nel buio...
sed "s/OPT ([0-9]+\\?)/xxxx/"
dovrebbe andare. man regex ti da' la sintassi delle (old-style) regex.
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it


 Invece di tail usa cat
 cat /var/log/syslog | while read ; do grep -s 'stringa'; done
-- 
echo 152079117477642780034933529998195782666P | dc

  cat /var/log/syslog | while read ; do grep -s 'stringa'; done
oppure usa direttamente grep
grep -s 'stringa' /var/log/syslog
-- 
dove una memoria ricompare 
vivere ancora una volta 
in un custode di primavera 
dubbio d'estate

 
Lette! :-)
Ma il dubbio rimane: il problema e' sed, iptables...o che dovevo proprio 
postarlo su it.salute.umorismo??
Laura

 
Grazie ancora a chi ha risposto
Laura

 rientrano nel 'filtro' non vengono mostrati.
Ciao,
 credo che MadLaura abbia ragione su questo punto ... di default, tutte le
pipe sono bufferizzate a blocchi di 8192 caratteri; prima che l'ultimo sed
stampi qualcosa sul terminale, il tail deve leggere abbastanza righe
perche' il penultimo sed possa mandare 8192 caratteri sul suo standard
output.
MadLaura, se vuoi un filtro in tempo reale, prova con unbuffer dopo ogni
pipe.
tail -f ... | unbuffer grep ... | unbuffer sed ...
Per il problema di OPT, non sono sicuro di aver capito come sono fatte
esattamente le righe che devi filtrare, ma forse questo puo' esserti
utile:
$ echo 'AAA OPT (12345) BBB' | sed 's/OPT ([0-9]*)//'
AAA  BBB
 Ciao
 Federico

[ it.comp.os.linux.iniziare ] replica a MadLaura

 comp.unix.shell  
 
 Ma perche' non usi awk come ha suggerito Davide?
-- 
echo 152079117477642780034933529998195782666P | dc

 
Grazie ancora
Laura

 "OPT+unospazio+unaparentesiaperta+molte cifre+unaparentesichiusa"?
23:37:39 sanmartino:~$ echo b-b-b-"OPT (917234967987123498797)-a-a-a" |
sed 's/OPT ([0-9]\+)/c-c-c/'
b-b-b-c-c-c-a-a-a
23:37:46 sanmartino:~$ 
-- 
e di sůbito parve giorno a giorno
essere aggiunto, come quei che puote
avesse il ciel d'un altro sole addorno