Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Filtrar comodins/regex de les línies

2 views
Skip to first unread message

Narcis Garcia

unread,
Jan 17, 2024, 2:40:04 AM1/17/24
to
Bones,

Tinc un fitxer de text, com podria ser per exemple una llista de números
de telèfon (coneguts.txt):
972123456
972111133
972111134
972111135
972111136
972789012
però m'agradaria representar-hi rangs compatibles (expressions regulars)
per abreviar:
972123456
9721111..
972789012

En un moment donat, vull localitzar la línia que coincideixi amb la dada
que tinc (expressió 972123456), seguint l'exemple dels números de telèfon:
$ grep coneguts.txt -e '972123456'
972123456

així que també m'agradaria fer-ho al revés; localitzar l'expressió
compatible amb una cadena:
$ grep coneguts.txt -e '972111199'
9721111..

Algú sap com fer-ho?

Gràcies.

--
Narcis Garcia

__________
I'm using this dedicated address because personal addresses aren't
masked enough at this mail public archive. Public archive administrator
should remove and omit any @, dot and mailto combinations against
automated addresses collectors.

jordi Perera

unread,
Jan 17, 2024, 6:20:04 AM1/17/24
to
això?

exemple buscar el que contingui un 34

grep -E '[0-9]?34[0-9]?' telefons.txt


--
Jordi Perera

Narcis Garcia

unread,
Jan 17, 2024, 8:00:05 AM1/17/24
to
El 17/1/24 a les 12:10, jordi Perera ha escrit:
No, seguint el teu exemple, voldria buscar per exemple amb quins patrons
encaixaria un «34» de prefix:
34930000000
3.930000000
.4930000000
44930000000
4.930000000

Buscant un «34» inicial m'hauria de tornar les 3 primeres línies (el
punt és comodí)

Narcis Garcia

unread,
Jan 17, 2024, 8:30:04 AM1/17/24
to
El 17/1/24 a les 12:10, jordi Perera ha escrit:

Xavier Drudis Ferran

unread,
Jan 17, 2024, 9:40:03 AM1/17/24
to


El primer cas que demanaves sembla fàcil

grep -f fitxer_regexps.txt fitxer_nums.txt

Pel segon no sé cap comanda directa, potser alguna cosa tipus

#!/bin/bash
text=${1:-93123111}
fitxer_regexps=${2:-fitxer_regexps.txt}

for r in $(< "$fitxer_regexps") ; do {
grep -qE "$r" - <<< "$text" && echo "$r" ;
} ; done


Però això podria ser més eficient si t'ho programes el perl o python o
el que sigui...

julio

unread,
Jan 17, 2024, 10:20:04 AM1/17/24
to


El 17 de gener de 2024 8:39:26 CET, Narcis Garcia <debia...@actiu.net> ha escrit:
>Bones,
>
>Tinc un fitxer de text, com podria ser per exemple una llista de números de telèfon (coneguts.txt):
>972123456
>972111133
>972111134
>972111135
>972111136
>972789012
>però m'agradaria representar-hi rangs compatibles (expressions regulars) per abreviar:
>972123456
>9721111..
>972789012

Com no estem acotant amb ^ ni amb $


9
7
2
.
etcètera
97
72
21
9.
.9
etc
972
97.
9.2

I això sense fent servir només dígits i el caràcter . no literal.

Sembla un problema matemàtic de combinatòria :)

O probablement no ho he entès.

Vagi bé.


>En un moment donat, vull localitzar la línia que coincideixi amb la dada que tinc (expressió 972123456), seguint l'exemple dels números de telèfon:
>$ grep coneguts.txt -e '972123456'
>972123456
>
>així que també m'agradaria fer-ho al revés; localitzar l'expressió compatible amb una cadena:
>$ grep coneguts.txt -e '972111199'
>9721111..
>
>Algú sap com fer-ho?
>
>Gràcies.
>

-------------------------------------
--
El 2003 el català era la llengua habitual del 46 % dels catalans. Al 2018 només del 36 %. Si els castellanoparlants no actuem, desapareixerà.

El 3 de novembre representa el moment de l'any en el que les dones deixen de cobrar en comparació amb els homes. Hem d’ajudar a les dones a eliminar aquesta data.

L’administració pública cada any es gasta milions d’euros en llicències de programari privatiu. Utilitzant programari lliure estalviem costos i incentivem l’economia local.

La neutralitat davant les desigualtats acaba accentuant-les.

Narcis Garcia

unread,
Jan 17, 2024, 1:40:03 PM1/17/24
to
Aquesta proposta(2) té sentit, i de fet necessito incloure-ho en un
programet ShellScript, però volia veure si podia evitar un bucle «for»
utilitzant alguna comanda directa de grep, pcregrep o similar.

Gràcies.


El 17/1/24 a les 15:35, Xavier Drudis Ferran ha escrit:

Narcis Garcia

unread,
Jan 17, 2024, 1:50:04 PM1/17/24
to
Aquesta proposta d'en Joan funciona:

Coneguts="34930000000
3.930000000
.4930000000
44930000000
4.930000000"

echo "$Coneguts" > coneguts.txt

CercantInici="34"

PatroCerca="^$(echo "$CercantInici" | sed -ne 's/\([0-9]\)/[\.\1]/gp')"

echo "$PatroCerca"

grep -E "$PatroCerca" coneguts.txt

GRÀCIES!


El 17/1/24 a les 17:53, Joan Montané ha escrit:
>
>
> Missatge de Narcis Garcia <debia...@actiu.net
> <mailto:debia...@actiu.net>> del dia dc., 17 de gen. 2024 a les 8:39:
>
> Bones,
>
>
> Algú sap com fer-ho?
>
>
> Si he entès bé el problema, la cosa seria així:
>
> cat coneguts.txt | grep -E "^[\.3][\.4]"
>
> El que faig és (manualment) canviar cada caràcter del prefix (per
> exemple, 3) que vols buscar per la parella formada pel mateix caràcter i
> un punt normal (en l'exemple [\.3]). La resta és senzill, cercar en el
> fitxer amb dades per l'expressió regular de línies que comencin per
> l'expressió regular.
>
> Una millora seria fer la conversió "34" a "[\.3][\.4]" de forma automàtica.
>
> Un primer intent pot ser amb 'sed', per exemple:
>
> echo 34 | sed -ne 's/\([0-9]\)/[\.\1]/gp
>
> retorna:
> [.3][.4]
>
> que podem usar en l'ordre inicial proposada.
>
> Ajuntant les dues coses...
>
> PREFIX=`echo 34 | sed -ne 's/\([0-9]\)/[\.\1]/gp'`
> cat coneguts.txt | grep -E "^$PREFIX"
>
> sembla que hauria de rutllar.
>
> En una única línia...
> PREFIX=`echo 44 | sed -ne 's/\([0-9]\)/[\.\1]/gp'` && cat coneguts.txt |
> grep -E "^$PREFIX"
>
> Sí, uso una variable d'entorn per a guardar el prefix en la forma
> [\.3][\.4]. Si algú sap com enviar aquesta cadena al grep d'una forma
> més elegant, que ho digui, sisplau.
>
> És això el que volies?
>
> Salut!
> Joan Montané

Narcis Garcia

unread,
Jan 17, 2024, 2:10:03 PM1/17/24
to
--
Narcis Garcia

papapep

unread,
Jan 17, 2024, 2:10:05 PM1/17/24
to
Per a aquestes cosetes, awk és una navalla suïssa. Amb un oneliner com:

awk '/pauta_a_buscar/ {print $0}' fitxer_on_buscar

et treurà totes les coincidències.

Salut.

Ernest Adrogué

unread,
Jan 17, 2024, 3:50:04 PM1/17/24
to
2024-01-17, 08:39 (+0100); Narcis Garcia escriu:
> Bones,
>
> Tinc un fitxer de text, com podria ser per exemple una llista de números de
> telèfon (coneguts.txt):
> 972123456
> 972111133
> 972111134
> 972111135
> 972111136
> 972789012
> però m'agradaria representar-hi rangs compatibles (expressions regulars) per
> abreviar:
> 972123456
> 9721111..
> 972789012

Hi ha una cosa que no entenc. El patró "9721111.." representa els
números 972111100, 972111101, 972111102, ..., 972111198, 972111199.
Mentre que a la teva llista només hi tens el 972111133, 972111134,
972111135, i el 972111136. Si substitueixes aquests números pel patró
"9721111.." el resultat és un conjunt de números que és DIFERENT de
l'original.


Salutacions

Narcis Garcia

unread,
Jan 18, 2024, 2:00:04 AM1/18/24
to
El 17/1/24 a les 21:39, Ernest Adrogué ha escrit:
No era més que un exemple; la primera llista com si fos la típica (per a
filtrar de forma senzilla amb grep), i la segona com voldria poder-la
fer. És a dir, en comptes de fer una llista amb 100 línies «9721111xx»
(del 00 al 99) poder-hi posar un patró en una sola línia.

PERÒ igualment el tema dels números de telèfon és només un exemple
senzill; no es tracta dels números sinó de buscar patrons amb una cadena
fixa en comptes de buscar cadenes amb un patró.

Exemple amb números de DNI; la llista seria:
ES......... Spain
FR......... France
.........DE Germany
IT......... Italy

I donat un DNI «55667788DE» poder trobar la línia del patró corresponent:
.........DE Germany
I així extraure el nom de l'estat després de l'espai: Germany.

Cas més sofisticat; Rangs d'adreces IPv4 en un fitxer «spammers.txt»:
55\.66\.77\.88
66\.77\.88\..*
99\.11\.22\.33

i amb això trobar que si la IP de l'interlocutor té coincidència a la
llista, aleshores no acceptar-lo. I així poder incloure rangs també.

Alex Muntada

unread,
Jan 21, 2024, 7:30:04 AM1/21/24
to
Hola Narcis,

> no es tracta dels números sinó de buscar patrons amb una cadena
> fixa en comptes de buscar cadenes amb un patró.
>
> Exemple amb números de DNI; la llista seria:
> ES......... Spain
> FR......... France
> .........DE Germany
> IT......... Italy
>
> I donat un DNI «55667788DE» poder trobar la línia del patró
> corresponent:
> .........DE Germany
> I així extraure el nom de l'estat després de l'espai: Germany.

Amb Python, Perl o algun altre llenguatge de més alt nivell no
seria més fàcil d'obtenir el país perquè podries capturar la
part de l'expressió regular que t'interessi i utilitzar-la per
indexar un diccionari:

```
#!/usr/bin/perl

use v5.32;
use strict;
use warnings;

my %paisos = (
'DE' => 'Germany',
);

for my $item (<DATA>) {
chomp($item);
say "$item -> $paisos{$1}" if $item =~ /([A-Z]{2})$/;
}

__DATA__
12345678DE
```

> Cas més sofisticat; Rangs d'adreces IPv4 en un fitxer
> «spammers.txt»:
> 55\.66\.77\.88
> 66\.77\.88\..*
> 99\.11\.22\.33
>
> i amb això trobar que si la IP de l'interlocutor té
> coincidència a la llista, aleshores no acceptar-lo.
> I així poder incloure rangs també.

Les expressions regulars per als rangs IP són poc acurades perquè
no tenen en compte les màscares de bits dels segments. En general
és millor enfocar aquest problema d'una altra manera més eficient
(per exemple amb ipset) i utilitzar llistes negres que tinguin
una reputació prou bona, per exemple:

https://github.com/firehol/blocklist-ipsets

És un tema que fa uns mesos que em vull mirar amb deteniment,
però en el que encara no he pogut aprofundir. Si algú hi té
experiència, estaria bé que ens expliqui com ho fa per incloure
llistes negres al tallafocs.

Salut,
Alex

--
⢀⣴⠾⠻⢶⣦⠀
⣾⠁⢠⠒⠀⣿⡁ Alex Muntada <al...@debian.org>
⢿⡄⠘⠷⠚⠋ Debian Developer 🍥 log.alexm.org
⠈⠳⣄⠀⠀⠀⠀

signature.asc

Lluís Gras

unread,
Jan 22, 2024, 8:20:03 AM1/22/24
to
Jo no ho qualificaria d'experiència, però si us serveix per agafar alguna idea que no sigui dolenta.

Tinc un parell de guions, l'un s'executa un cop al dia i descarrega una llista i l'afegeix a un conjunt ipset.

root@gwbox:~# cat /usr/local/bin/llista_l1
#!/bin/sh

ipset create Firehol_L1 hash:net -exist

ipset flush  Firehol_L1

rm -f  /etc/firehol_level1.netset

wget -c https://iplists.firehol.org/files/firehol_level1.netset -O /etc/firehol_level1.netset

if [ $? -eq 0 ]; then

sed -i '/192\.168\./d' /etc/firehol_level1.netset

for i in $(cat /etc/firehol_level1.netset | grep -v ^# ); do ipset add Firehol_L1 $i; done

ipset save -file /etc/iptables/ipsets

fi

amb 

ipset list Firehol_L1

es poden consultar les xarxes que bloqueja.

L'altre s'executa cada 5 minuts i és similar

root@gwbox:~# cat /usr/local/bin/ufwblock
#!/bin/sh

ipset create UFWBlockList hash:ip -exist

ipset flush  UFWBlockList

#Suposo que en equips nous farà falta afegir el syslog-ng o establir la destinació del log de l'ufw.
# El 5 en negreta parametritza quantes vegades ha d'aparèixer una ip al log per afegir-la a l'ipset.

for i in $(cat /var/log/messages | grep BLOCK | awk -F= '{print $5}' | cut -d " " -f 1 | sort | uniq -c | awk '{ if ($1 >=5) print $2}'); do ipset add UFWBlockList $i; done

#en el meu cas, per estalviar-me bloquejos innecessaris.
ipset del UFWBlockList 192.168.2.2
ipset del UFWBlockList 192.168.1.1

ipset save -file /etc/iptables/ipsets

A banda, també vaig instal·lar el fwlogwatch que t'envia un informe diari.



Missatge de Alex Muntada <al...@debian.org> del dia dg., 21 de gen. 2024 a les 13:22:

Lluís Gras

unread,
Jan 22, 2024, 8:30:05 AM1/22/24
to
I m'he oblidat de comentar que cal afegir les pertinents regles al UFW

root@gwbox:~# tail -n 12 /etc/ufw/before.rules
# Ipset
# Un cop comprovat que funciona, ens estalviem els logs.
#-A ufw-before-input -m set --match-set Firehol_L1 src -j LOG --log-level 4 --log-prefix "Blocked by IPset: "

#-A ufw-before-input -m set --match-set UFWBlockList src -j LOG --log-level 4 --log-prefix "Blocked by IPset: "

-A ufw-before-input -m set --match-set Firehol_L1 src -j DROP

-A ufw-before-input -m set --match-set UFWBlockList src -j DROP

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

Missatge de Lluís Gras <lluis...@gmail.com> del dia dl., 22 de gen. 2024 a les 14:14:

Alex Muntada

unread,
Jan 24, 2024, 4:00:04 AM1/24/24
to
Hola Lluís,

> I m'he oblidat de comentar que cal afegir les pertinents regles
> al UFW

Tot això que has compartit em sembla molt més fàcil d'entendre i
senzill de provar que configurar firehol sencer.

Salut i moltes gràcies!
signature.asc

Alex Muntada

unread,
Jan 26, 2024, 6:00:05 AM1/26/24
to
Hola Lluís,

amb la teva ajuda, ja tinc funcionant llistes negres amb ipset :)

> # El *5 *en negreta parametritza quantes vegades ha d'aparèixer
> una ip al log per afegir-la a l'ipset.
>
> for i in $(cat /var/log/messages | grep BLOCK | awk -F= '{print
> $5}' | cut -d " " -f 1 | sort | uniq -c | awk '{ if ($1 >=*5*)
> print $2}'); do ipset add UFWBlockList $i; done

Per fer això jo utilitzo fail2ban, però és cert que està molt
lligat a les iptables i, si la teva llista negra personal creix,
aleshores pot anar més lent que fent-ho amb ipset.

> A banda, també vaig instal·lar el fwlogwatch que t'envia un
> informe diari.

Té bona pinta, tot i que m'he adonat que el paquet està orfe.

Salut i gràcies de nou!
signature.asc
0 new messages