grep mit bestimmter zahl

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

grep mit bestimmter zahl

Beitrag von latenite » 28.09.2009 20:59:56

Hallo Leute

Wie kann ich mit grep eine ganz bestimmter zahl finden. Also ohne wiederholungend er Nummern.
Wenn ich nach 1 grepe dann kommt auch 12 und 11.
grep -w geht in meinem fall glaube ich nicht.?

Code: Alles auswählen

0:548:root@pendrive /media/disk/subscripts [0]# find /dev/ -type b | cat | grep ^/dev/[s,h].*[0-9]$ | grep 10
/dev/sda10
0:549:root@pendrive /media/disk/subscripts [0]# find /dev/ -type b | cat | grep ^/dev/[s,h].*[0-9]$ | grep 1
/dev/sda11
/dev/sda10
/dev/sda1
/dev/sdb1
0:550:root@pendrive /media/disk/subscripts [0]# 

aussehen soll das dann so:

Code: Alles auswählen

0:550:root@pendrive /media/disk/subscripts [1]# zahl=1
0:551:root@pendrive /media/disk/subscripts [0]# find /dev/ -type b | cat | grep ^/dev/[s,h].*[0-9]$ | grep $zahl
/dev/sda1
/dev/sdb1
0:552:root@pendrive /media/disk/subscripts [0]# 
und nicht so wie' s jetzt ist:

Code: Alles auswählen

0:550:root@pendrive /media/disk/subscripts [1]# zahl=1
0:551:root@pendrive /media/disk/subscripts [0]# find /dev/ -type b | cat | grep ^/dev/[s,h].*[0-9]$ | grep $zahl
/dev/sda11
/dev/sda10
/dev/sda1
/dev/sdb1
0:552:root@pendrive /media/disk/subscripts [0]# 
Danke schon mal :)

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: grep mit bestimmter zahl

Beitrag von latenite » 28.09.2009 21:06:08

kein erfolg damit:

Code: Alles auswählen

0:557:root@pendrive /media/disk/subscripts [1]# find /dev/ -type b | cat | grep ^/dev/[s,h].*[0-9]$ | grep $zahl
/dev/sda11
/dev/sda10
/dev/sda1
/dev/sdb1
0:558:root@pendrive /media/disk/subscripts [0]# find /dev/ -type b | cat | grep ^/dev/[s,h].*[0-9]$ | grep "$zahl"
/dev/sda11
/dev/sda10
/dev/sda1
/dev/sdb1
0:559:root@pendrive /media/disk/subscripts [0]# 
:cry:

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: grep mit bestimmter zahl

Beitrag von latenite » 28.09.2009 21:07:04

hast du meinen oneliner bei dir probiert snoopy?

find /dev/ -type b | cat | grep ^/dev/[s,h].*[0-9]$ | grep "$zahl"

Danke

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: grep mit bestimmter zahl

Beitrag von latenite » 28.09.2009 21:09:25

Ich schwöre hier stand grad noch n Beitrag von "snoopy"....wo is n der hin?

Benutzeravatar
Snoopy
Beiträge: 4297
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Re: grep mit bestimmter zahl

Beitrag von Snoopy » 28.09.2009 21:11:56

Hi,

das war geistiger Müll den ich da geschrieben habe...das habe ich aber erst kurz nachdem ich den Beitrag geschrieben habe, gemerkt *ggg

Du irrst nicht, da war ein Beitrag.

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: grep mit bestimmter zahl

Beitrag von latenite » 28.09.2009 21:16:17

und...hast du ne idee?
rätsel hier rum mit:
find /dev/ -type b | cat | grep ^/dev/[s,h].*[0-9]$ | sed -n -e /1/p
gehts auch nicht.

:(

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: grep mit bestimmter zahl

Beitrag von cosmac » 28.09.2009 21:44:40

hi,

"find -type b" wirft bei mir auch /dev/sbpcdx aus, vielleicht geht's so besser:

Code: Alles auswählen

cat /proc/partitions | grep "[a-z]$zahl$"
Beware of programmers who carry screwdrivers.

Benutzeravatar
Snoopy
Beiträge: 4297
Registriert: 17.11.2003 18:26:56
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rh.- Pflz.

Re: grep mit bestimmter zahl

Beitrag von Snoopy » 28.09.2009 21:55:10

Hi,

ist das gewünschte Ergebnis immer so aufgebaut?

Code: Alles auswählen

/dev/sd
Ein

Code: Alles auswählen

grep -x /dev/sd.$zahl
hilft da auch nicht weiter oder?

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: grep mit bestimmter zahl

Beitrag von latenite » 28.09.2009 22:15:48

Code: Alles auswählen

cat /proc/partitions | grep "[a-z]$zahl$"
kann ich nicht nutzen da ich aus einem file grepe.
Das sieht so aus:

Code: Alles auswählen

0:530:root@pendrive /home/user [1]# sfdisk -d /dev/sda
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=       63, size=250067727, Id= 5
/dev/sda2 : start=        0, size=        0, Id= 0
/dev/sda3 : start=        0, size=        0, Id= 0
/dev/sda4 : start=        0, size=        0, Id= 0
/dev/sda5 : start=      126, size=   208719, Id=83
/dev/sda6 : start=   208908, size= 19551042, Id=83
/dev/sda7 : start= 19760013, size=  3919797, Id=83
/dev/sda8 : start= 23679873, size=  3919797, Id=83
/dev/sda9 : start= 27599733, size= 29318562, Id=83
/dev/sda10: start= 56918358, size= 19551042, Id=83
/dev/sda11: start= 76469463, size= 19551042, Id=83
0:531:root@pendrive /home/user [0]# 
da ich keine devices mif H wie /dev/hda auf diesem system habe muss ich als beispiel /devram hernehmen. Um zu zeigen das grep -x leider auch nicht geht.

Code: Alles auswählen

0:546:root@pendrive /home/user [0]# find /dev/ -type b | cat | grep ^/dev/[s,r].*[0-9]$ | grep -x /dev/sd.$zahl
/dev/sda1
/dev/sdb1
0:547:root@pendrive /home/user [0]# find /dev/ -type b | cat | grep ^/dev/[s,r].*[0-9]$ | grep -x /dev/ram.$zahl
/dev/ram11
0:548:root@pendrive /home/user [0]# 
Mal angenoommen man hat einen Text:

Code: Alles auswählen

1 mensch hat 10 finger,  1 bett,  11 sommersprossen,  100 euro , 111 damaltiner
und will die anzahl der der zahl 1 (NICHT der Ziffer) wissen. Hier also Zwei.
Wie macht man das dann mit grep?

Danke für eure Hilfe...echt ! :)

Benutzeravatar
pinguino
Beiträge: 147
Registriert: 23.01.2007 23:11:46

Re: grep mit bestimmter zahl

Beitrag von pinguino » 28.09.2009 22:23:49

z.B

Code: Alles auswählen

grep '^1$' latenite
Gruß

Pinguino

>>Nota bene<<

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: grep mit bestimmter zahl

Beitrag von cosmac » 29.09.2009 02:21:53

aus deinem Beispiel-File sollte es so gehen:

Code: Alles auswählen

grep "[a-z]$zahl[ :|:]" $file
aber irgendwie ist das doch ganz was anderes als mit "find"?
Beware of programmers who carry screwdrivers.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: grep mit bestimmter zahl

Beitrag von Duff » 29.09.2009 07:57:38

Muss es unbedingt grep sein?
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: grep mit bestimmter zahl

Beitrag von Meillo » 29.09.2009 10:30:14

Mal ein paar Anmerkungen zu den RegExps:

Code: Alles auswählen

grep ^/dev/[s,h].*[0-9]$
`[s,h]' matched auf eines der _drei_ Zeichen 's', ',', 'h'. Das war wohl eher nicht gewünscht. `[sh]' ist vermutlich das was du meintest.

Code: Alles auswählen

grep "[a-z]$zahl[ :|:]" $file
`[ :|:]' mached auf eines der _vier_ Zeichen: ' ', ':', '|', (nochmal) ':'. Du meintest aber bestimmt: `[ :]'.


Zum eigentlichen Problem: Wenn ein Teil einer Zahl (z.B. `1' in `10') kein Treffer sein soll, dann darfst du nicht nur nach `1' suchen, sondern musst in der RegExp darstellen, dass nach der `1' keine weitere Nummer folgen darf. cosmac hat das schön gezeigt. Invertierte Zeichengruppen sind ein ähnlicher Ansatz: /[a-z]$zahl[^0-9]/ (wobei diese RE keine Zahl am Zeilenende matched!). Forward-References die dieses Problem schön behandeln könnten gibt's bei *grep nicht.

Duff hat geschrieben:Muss es unbedingt grep sein?
Wenn er nach etwas in einer Datei/Pipeline sucht, dann ist `grep' schon das Programm der Wahl. (Mal abgesehen von den Forward-References die man mit Perl z.B. hätte. Aber ich denke das lohnt sich hier nicht.)
Use ed once in a while!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: grep mit bestimmter zahl

Beitrag von latenite » 29.09.2009 13:08:44

Also geht das was ich will gar nicht?

Angenommen Man hat ein file in dem "bunt gemischt" VIELE verschiedene devices stehen: also so etwa

Code: Alles auswählen

/dev/sdb3
/dev/sdb2
/dev/sdb1
/dev/sda3
/dev/sda2
/dev/sda10
/dev/sda11
/dev/ram9
/dev/ram8
/dev/hda11
/dev/ram7
/dev/hdb1
/dev/hda3
/dev/hda2
/dev/hda1
/dev/ram6
/dev/ram5
/dev/ram4
/dev/ram3
/dev/ram2
/dev/ram14
/dev/ram15
/dev/ram13
/dev/ram11
/dev/ram12
/dev/ram10
/dev/ram1
/dev/ram0
und man will die angezeigt (rausgereppt) haben die partitionsnummer 1 aber nicht partitionsnummer 10 oder 11 tragen.
Wie würde man das anstellen?

Eure Beispiele habe ich ausprobiert...kein erfolg. Vielleicht hab ich was nicht verstanden aber hier mal die Ausgabe dazu.
Ich habe eine Var. ${zahl} die 1 ist und suche in der ausgabe von

Code: Alles auswählen

find /dev/ -type b | cat | grep ^/dev/[sr].*[0-9]$
nach allen devices die NUR ne 1 haben. Das mit dem unmatchen [^0-9] bringt hier auch nix weil die Ausgabe ja mit ner Zahl endet.

Code: Alles auswählen

0:135:user@pendrive ~ [1]$ zahl=1
0:136:user@pendrive ~ [0]$ find /dev/ -type b | cat | grep ^/dev/[sr].*[0-9]$ | grep "[a-z]$zahl[ :|:]"
0:137:user@pendrive ~ [1]$ find /dev/ -type b | cat | grep ^/dev/[sr].*[0-9]$ | grep "[a-z]$zahl[ :]"
0:138:user@pendrive ~ [1]$ find /dev/ -type b | cat | grep ^/dev/[sr].*[0-9]$ 
/dev/sdb3
/dev/sdb2
/dev/sdb1
/dev/sda3
/dev/sda2
/dev/sda1
/dev/ram9
/dev/ram8
/dev/ram7
/dev/ram6
/dev/ram5
/dev/ram4
/dev/ram3
/dev/ram2
/dev/ram14
/dev/ram15
/dev/ram13
/dev/ram11
/dev/ram12
/dev/ram10
/dev/ram1
/dev/ram0
0:139:user@pendrive ~ [0]$ find /dev/ -type b | cat | grep ^/dev/[sr].*[0-9]$ | grep "[a-z]$zahl[^0-9]"
0:140:user@pendrive ~ [1]$ find /dev/ -type b | cat | grep ^/dev/[sr].*[0-9]$ | grep "[a-z]$zahl[^1-9]"
/dev/ram10
0:141:user@pendrive ~ [0]$ 

ginbt es hier überhaupt einen weg mit grep? Kann ich ein anderes toll nutzen?

Danke

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: grep mit bestimmter zahl

Beitrag von Meillo » 29.09.2009 14:52:50

latenite hat geschrieben:Also geht das was ich will gar nicht?
Doch.
und man will die angezeigt (rausgereppt) haben die partitionsnummer 1 aber nicht partitionsnummer 10 oder 11 tragen.
Wie würde man das anstellen?
Das Problem ist eigentlich, _exakt_ zu formulieren was man denn will. In deinem Fall ist das: Eine Zeile die mit `/dev/' anfängt, denn ein `s' oder ein `r' hat, dann sollen weitere Buchstaben (nicht ein beliebiges Zeichen!) folgen können, dann die gesuchte Zahl (`1') und dann das Zeilenende.

Code: Alles auswählen

grep '^/dev/[sr][a-z]*'$zahl'$'

btw:

Code: Alles auswählen

find /dev/ -type b | cat | grep ^/dev/[sr].*[0-9]$
Wozu denn das `cat'?
Use ed once in a while!

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Re: grep mit bestimmter zahl

Beitrag von Spasswolf » 29.09.2009 14:58:11

So?

Code: Alles auswählen

$ export zahl=1
$ echo $zahl
1
$ find /dev -type b | grep -E "\<[^[:digit:]]*$zahl[^[:digit:]]*\>"
/dev/sda1
/dev/ram1
$ export zahl=11
$ echo $zahl
11
$ find /dev -type b | grep -E "\<[^[:digit:]]*$zahl[^[:digit:]]*\>"
/dev/ram11

chrisbra
Beiträge: 122
Registriert: 19.10.2005 09:36:09
Wohnort: Sachsen-Anhalt
Kontaktdaten:

Re: grep mit bestimmter zahl

Beitrag von chrisbra » 29.09.2009 15:21:25

find /dev -type b |grep '[^0-9]1$'

ciao,
Christian
Meine Whishlist
:wq!

latenite
Beiträge: 688
Registriert: 14.05.2007 01:04:23

Re: grep mit bestimmter zahl

Beitrag von latenite » 30.09.2009 14:59:40

Hey Meillo

dein Vorschlag mit "grep '^/dev/[sr][a-z]*'$zahl'$'" ging. Muss zugeben das ich das ganze regexen noch n bischen üben muss. Danke für eure Hilfe
Das "cat" habe ich drin weil ich die variable in dem script in so einem "select" mit Zahlen nutzen will. Und ohne "cat" gings nicht.

Danke gelöst :D :D :D

Antworten