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.
On 17-01-2024 8:39, Narcis Garcia wrote:
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.
això?
exemple buscar el que contingui un 34
grep -E '[0-9]?34[0-9]?' telefons.txt
On 17-01-2024 8:39, Narcis Garcia wrote:
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.
això?
exemple buscar el que contingui un 34
grep -E '[0-9]?34[0-9]?' telefons.txt
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.
Missatge de Narcis Garcia <debianlists@actiu.net <mailto:debianlists@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é
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...
Missatge de Narcis Garcia <debianlists@actiu.net <mailto:debianlists@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é
Bones,
Tinc un fitxer de text, com podria ser per exemple una llista de nmeros de telfon (coneguts.txt):
972123456
972111133
972111134
972111135
972111136
972789012
per m'agradaria representar-hi rangs compatibles (expressions regulars) per abreviar:
972123456
9721111..
972789012
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.
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é.
I m'he oblidat de comentar que cal afegir les pertinents regles
al 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
A banda, també vaig instal·lar el fwlogwatch que t'envia un
informe diari.
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 297 |
Nodes: | 16 (2 / 14) |
Uptime: | 107:36:08 |
Calls: | 6,662 |
Calls today: | 4 |
Files: | 12,209 |
Messages: | 5,335,491 |