Valamiért a sorvéget nem tudom vele megértetni.
Azt várom, hogy ne legyenek a kimenetben benne azok a sorok, amiben a SUCCESS után nincs olvasható karakter (csak szóköz).
próbáltam:
cat ezafile.txt |grep -v "SUCCESS $"
cat ezafile.txt |grep -v "SUCCESS..$"
de nem vált be.
Próbáltam megfordítani: csak az jöjjön, ami olyan:
cat ezafile.txt |grep "SUCCESS $"
cat ezafile.txt |grep "SUCCESS..$"
és semmi.
Ellenben fordítva szűrve már látom azokat a sorokat, amiket nem akarok látni:
cat ezafile.txt |grep "SUCCESS " |grep -v "SUCCESS L"
Mit bökök el?
[\\ASUSIMI]
0 12:55:21 ttermpro.exe IRP_MJ_CREATE Serial0 Options: Open
0 12:55:21 SUCCESS
1 12:55:21 ttermpro.exe IOCTL_SERIAL_GET_COMMSTATUS Serial0
1 12:55:21 SUCCESS
2 12:55:21 ttermpro.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 InSize: 8192 OutSize: 2048
2 12:55:21 SUCCESS
3 12:55:21 ttermpro.exe IOCTL_SERIAL_PURGE Serial0 Purge: TXABORT RXABORT TXCLEAR RXCLEAR
3 12:55:21 SUCCESS
4 12:55:21 ttermpro.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 RI:-1 RM:0 RC:0 WM:0 WC:500
4 12:55:21 SUCCESS
5 12:55:21 ttermpro.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0
5 12:55:21 SUCCESS
...
1360 13:01:09 SUCCESS Length 0:
Ugyanez hex-ben:
5B 5C 5C 41 53 55 53 49 4D 49 5D 0D 0A
30 20 20 31 32 3A 35 35 3A 32 31 20 20 74 74 65 72 6D 70 72 6F 2E 65 78 65 20 20 49 52 50 5F 4D 4A 5F 43 52 45 41 54 45 20 20 53 65 72 69 61 6C 30 20 20 4F 70 74 69 6F 6E 73 3A 20 4F 70 65 6E 20 0D 0A
30 20 20 31 32 3A 35 35 3A 32 31 20 20 53 55 43 43 45 53 53 20 20 0D 0A
31 20 20 31 32 3A 35 35 3A 32 31 20 20 74 74 65 72 6D 70 72 6F 2E 65 78 65 20 20 49 4F 43 54 4C 5F 53 45 52 49 41 4C 5F 47 45 54 5F 43 4F 4D 4D 53 54 41 54 55 53 20 20 53 65 72 69 61 6C 30 20 20 0D 0A
31 20 20 31 32 3A 35 35 3A 32 31 20 20 53 55 43 43 45 53 53 20 20 0D 0A
32 20 20 31 32 3A 35 35 3A 32 31 20 20 74 74 65 72 6D 70 72 6F 2E 65 78 65 20 20 49 4F 43 54 4C 5F 53 45 52 49 41 4C 5F 53 45 54 5F 51 55 45 55 45 5F 53 49 5A 45 20 20 53 65 72 69 61 6C 30 20 20 49 6E 53 69 7A 65 3A 20 38 31 39 32 20 4F 75 74 53 69 7A 65 3A 20 32 30 34 38 0D 0A
32 20 20 31 32 3A 35 35 3A 32 31 20 20 53 55 43 43 45 53 53 20 20 0D 0A
33 20 20 31 32 3A 35 35 3A 32 31 20 20 74 74 65 72 6D 70 72 6F 2E 65 78 65 20 20 49 4F 43 54 4C 5F 53 45 52 49 41 4C 5F 50 55 52 47 45 20 20 53 65 72 69 61 6C 30 20 20 50 75 72 67 65 3A 20 54 58 41 42 4F 52 54 20 52 58 41 42 4F 52 54 20 54 58 43 4C 45 41 52 20 52 58 43 4C 45 41 52 0D 0A
33 20 20 31 32 3A 35 35 3A 32 31 20 20 53 55 43 43 45 53 53 20 20 0D 0A
34 20 20 31 32 3A 35 35 3A 32 31 20 20 74 74 65 72 6D 70 72 6F 2E 65 78 65 20 20 49 4F 43 54 4C 5F 53 45 52 49 41 4C 5F 53 45 54 5F 54 49 4D 45 4F 55 54 53 20 20 53 65 72 69 61 6C 30 20 20 52 49 3A 2D 31 20 52 4D 3A 30 20 52 43 3A 30 20 57 4D 3A 30 20 57 43 3A 35 30 30 0D 0A
34 20 20 31 32 3A 35 35 3A 32 31 20 20 53 55 43 43 45 53 53 20 20 0D 0A
35 20 20 31 32 3A 35 35 3A 32 31 20 20 74 74 65 72 6D 70 72 6F 2E 65 78 65 20 20 49 4F 43 54 4C 5F 53 45 52 49 41 4C 5F 47 45 54 5F 42 41 55 44 5F 52 41 54 45 20 20 53 65 72 69 61 6C 30 20 20 0D 0A
35 20 20 31 32 3A 35 35 3A 32 31 20 20 53 55 43 43 45 53 53 20 20 0D 0A
...
31 33 36 30 20 20 31 33 3A 30 31 3A 30 39 20 20 53 55 43 43 45 53 53 20 20 4C 65 6E 67 74 68 20 30 3A 20 0D 0A
- 4499 megtekintés
Hozzászólások
grep -v 'SUCCESS *$'
Bár szerintem előbb át kellene pipe-olni a dos2unix
utility-n, mert CR LF a sorvégéd.
Azt hagytad le, hogy bárhány szóközre illeszkedhet, meg az a 0x0D volt a másik gond.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ha jól érzem mindenhol két szóköz van utána és nálam msys alatt megy. De ez Windows alatt fut, így a sorvég gyanús lehet, ha Linux alatt viszont nem fut, mert úgy a sorvég és az utolsó szóköz között van egy karakter.
$ grep -v "SUCCESS $" l.txt
[\\ASUSIMI]
0 12:55:21 ttermpro.exe IRP_MJ_CREATE Serial0 Options: Open
1 12:55:21 ttermpro.exe IOCTL_SERIAL_GET_COMMSTATUS Serial0
2 12:55:21 ttermpro.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 InSize: 8192 Ou
tSize: 2048
3 12:55:21 ttermpro.exe IOCTL_SERIAL_PURGE Serial0 Purge: TXABORT RXABORT T
XCLEAR RXCLEAR
4 12:55:21 ttermpro.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 RI:-1 RM:0 RC:0 W
M:0 WC:500
5 12:55:21 ttermpro.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0
Ha tud ilyet, a space class a grep-ben "Space characters: in the 'C' locale, this is tab, newline, vertical tab, form feed, carriage return, and space.", tehát CR és LF is benne van.
$ grep -v -E "SUCCESS[[:space:]]*$" l.txt
[\\ASUSIMI]
0 12:55:21 ttermpro.exe IRP_MJ_CREATE Serial0 Options: Open
1 12:55:21 ttermpro.exe IOCTL_SERIAL_GET_COMMSTATUS Serial0
2 12:55:21 ttermpro.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 InSize: 8192 Ou
tSize: 2048
3 12:55:21 ttermpro.exe IOCTL_SERIAL_PURGE Serial0 Purge: TXABORT RXABORT T
XCLEAR RXCLEAR
4 12:55:21 ttermpro.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 RI:-1 RM:0 RC:0 W
M:0 WC:500
5 12:55:21 ttermpro.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0
Vagy előtte dos2unix átalakítás.
"Belépés díjtalan, kilépés bizonytalan."
- A hozzászóláshoz be kell jelentkezni
Grrr... "\$"
vagy '$'
. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Látod ment, így YMMV. :-)
"Belépés díjtalan, kilépés bizonytalan."
- A hozzászóláshoz be kell jelentkezni
Persze, mert a shell nem tudott vele mit kezdeni, ezért végül is literálisként helyettesített. Mondok hasonló példát rossz szokásra. Mondjuk ezt írod:
rpm -qa kernel*
Ez jó eséllyel visszaadja, milyen kernel kezdetű csomagnévvel rendelkező csomagok vannak feltelepítve a gépre. Mindez azért, mert az rpm literális * karaktert kapott. Ugyanakkor, ha van mondjuk egy kernelvalami nevű file az aktuális könyvtárban, a shell a * glob hatására helyettesíti a kernelvalami nevet az rpm argumentumába, arra nem lesz illeszkedés az rpm adatbázisban a csomagnevek között, így a parancs kimenete üres lesz.
A parancs tehát ugyanaz, az eredmény attól függ, az aktuális könyvtárban van-e kernel stringgel kezdődő nevű file vagy alkönyvtár. Ez viszont igen kellemetlen, félrevezető. Éppen ezért a helyes parancs például így néz ki:
rpm -qa kernel\*
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A példát értem, aposztróf vagy \ szokott nálam is játszani, de a grep-es példámhoz hasonlónál még soha nem ment félre. Ezek szerint szerencsém volt. A grep-es példámnál milyen esetben tudna a shell vele valamit kezdeni és így elrontja? Csak ki szeretném próbálni.
"Belépés díjtalan, kilépés bizonytalan."
- A hozzászóláshoz be kell jelentkezni
Értem, hogy arra utalsz, a $ jel éppen a sor végét jelenti így egy
grep "valami$valtozo"
értelmes, ugyanakkor ebben a regexpben a literális $ már nem. Abban azért egyetérthetünk, hogy a
grep 'valami$valtozo'
nem igazán értelmes kifejezés mást jelent, mint a fentebbi, értelmes változat. A sed esetében viszont tudok példát írni:
sed "sxvalami$xmásvalamix"
nem lesz helyes forma, helyette vagy a
sed 'sxvalami$xmásvalamix'
vagy a
sed "sxvalami\$xmásvalamix"
lehet a megoldás. Vadabb, egyben gyakorlatiasabb lehet @ karakterrel:
sed "s@valami$@másvalami@"
A shell kifejti az összes bemeneti paramétert, míg
sed "s@valami\$@másvalami@"
hatására az történik, amit szerettünk volna. Persze, hogy értelme legyen az idézőjelnek az aposztrof helyett:
sed "s@valami\$@${valtozo}@"
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Köszi, így persze stimmel, de ilyen formában nem is írnám. Én arra az esetre gondoltam ahogy írtam. Azt hittem ha valamilyen nevű állományom/változóm/bármim van/létezik, akkor bekavarhat a $ jel ahová írtam.
"Belépés díjtalan, kilépés bizonytalan."
- A hozzászóláshoz be kell jelentkezni
Ennek ellenére azt mondom, vagy aposztrofok között adj át literális dollár jelet, vagy idézőjelek között backslash-sel escape-eld azt. Így biztos, hogy jó lesz, és a kód olvasható is marad. Kihasználni azt, hogy a shellnek ugyan speciális jel a dollár, de az adott pozícióban éppen nem tud vele mit kezdeni, így mégis literálisként adja át - finoman szólva nem szép megoldás.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Mivel a $ jellemzően a reguláris kifejezések legvégén, vagy |-jel előtt szerepel, amellyel együtt "-jelek között nincs speciális jelentése, nem nagyon megy ezzel falnak az ember.
De próbáld ki ezt:
$ grep "!" /etc/hosts
... aztán ugyanezt aposztrófokkal!
- A hozzászóláshoz be kell jelentkezni
cat ezafile.txt |grep -v "SUCCESS $"
Nekem ez mukodott..azok a sorok, amik SUCCESS-el vegzodtek nem voltak benne a kimenetben..Ugyelj arra, mennyi szokozt raksz a 'SUCCESS' es a '$' koze..nekem 2-vel ment
- A hozzászóláshoz be kell jelentkezni
nekem pont ez a bajom, hogy nem ment (azért raktam code tag-be a parancsokat is, hogy látszódjon: két szóköz van ott..)
- A hozzászóláshoz be kell jelentkezni
A shell szereti megenni a $ jelet, meg sok mást...
- A hozzászóláshoz be kell jelentkezni
s van erre valami workaround?
- A hozzászóláshoz be kell jelentkezni
Van. \$, vagy " helyett '.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ezt (az egyebirant igen hasznos infot) tudtam, de ezekkel nem lett jo.
Alant megvan a megoldas: dos2unix. Koszonom!
- A hozzászóláshoz be kell jelentkezni
cat ezafile.txt | dos2unix | grep -v 'SUCCESS *$'
Tehát:
- az idézőjel miatt vagy escape-elni kell a $-t backslash-sel, vagy aposztrofok közé teszed a regexpet, így a shelltől elzárod
- a dos2unix kell a CR LF miatt, legalább is szerintem; nem próbáltam ki
- a * kell a regexpbe, mert lehet bárhány szóközöd, akár nulla is
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A dos2unix oldotta meg. A tobbi enelkul nem oldotta meg. Nagyon koszonom!
- A hozzászóláshoz be kell jelentkezni
Szívesen. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Persze, hiszen enélkül a regexpbe a CR-t - ha úgy tetszik, ^M vagy 0x0D - bele kellett volna írni a $ jel elé. De volt más hiba is, mert a felvetésedben idézőjelben volt a $ escape-elés nélkül, a szóközök is fix darabszámmal szerepeltek. Jó, egy logfile-ban valószínűleg mindig ugyanannyi szóközzel generálódik a tartalom, így ha bedrótozod a két szóközt, az is működni fog, de szerintem szebb, ha úgy írod, ahogy szóban meg is fogalmaztad: bármennyi szóköz lehessen ott. És az sem kizárt, hogy a shell rájött, azzal a $ jellel nem tud mit kezdeni, mert utána vége a stringnek, s jobb ötlete hiányában literális $-t helyettesített. Ettől még kellett volna az a \ .
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Így is menne:
cat ezafile.txt | dos2unix | grep -v "SUCCESS *\$"
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni