szöveg keresés színesen

Fórumok

Milyen trükkel lehetne megoldani a következő dolgot?
Van egy eldugott mappában pár txt fájl. Szeretnék rákeresni egy szóra vagy szövegrészletre ezekben a fájlokban.
Ezt megtudom oldani a grep -i "text" /path/*.txt paranccsal.
Viszont ekkor kiírja a teljes útvonalat ami zavaró.
Ha a grep -ih akkor nem ír ki semmilyen útvonalat, így nem tudom hogy az adott szövegrészletet melyik fájlban találta.
A find-del sem jutottam előrébb. Sőt.

A kívánatos az lenne ha megjelenítené a fájlt IS és a megtalált szöveget.
példa:

/path/path1/path2/path3/minta1.txt
/path/path1/path2/path3/minta2.txt 
/path/path1/path2/path3/minta3.txt 
/path/path1/path2/path3/minta4.txt 

Keresek szöveget: "ákombákom"
Ez a szöveg két fájlban is megtalálható.

grep -i "ákombákom" /path/path1/path2/path3/*.txt
/path/path1/path2/path3/minta2.txt: ákombákom a szélben
/path/path1/path2/path3/minta3.txt: ákombákom a viharban

Így szeretném megkapni az eredményt:
minta2.txt: ákombákom a szélben
minta3.txt: ákombákom a viharban

Csak a greppel mintha ezt nem tudnám elérni. Persze a "-c" kapcsolóval meg csak azt kapom ahol a kérdéses szöveg található, és hogy hányszor szerepel.
grep -c "ákombákom" /path/path1/path2/path3/*.txt
/path/path1/path2/path3/minta2.txt:1
/path/path1/path2/path3/minta3.txt:1

awk-kal meg lehet spékelni, vagy van jobb megoldás is?
grep -i "ákombákom" /path/path1/path2/path3/*.txt | awk -F'/' '{printf $5}'
Bár ebben az esetben elveszti a színeket. 

awk nélküli keresés esetén az én esetemben az útvonal lila, a keresett szöveg piros színt kap.
Ezt tipikusan akkor sikerül elérnem ha belépek a kérdéses mappába és ott adom ki csak a grep parancsot.
cd /path/path1/path2/path3/
grep -i "ákombákom" *.txt

Hozzászólások

Szerkesztve: 2025. 06. 29., v – 21:25

cd /path/path1/path2/path3/

grep -i "ákombákom" *.txt

(tobbet esszel mint awk-val:))

>  Ezt tipikusan akkor sikerül elérnem ha belépek a kérdéses mappába és ott adom ki csak a grep parancsot.

es akkor ez miert nem jo?

Ezt esetleg meg lehetne fejelni azzal, hogy ezt a 2 parancsot ( ) közé teszed, ekkor minden  egy új alshellben fut le, de mikor befejeződik, akkor újfent az eredeti környezetben találod magad (azaz nem kell pl. visszalépned "cd -" segítségével.)

Szerkesztve: 2025. 06. 30., h – 08:43

Bár ebben az esetben elveszti a színeket. 

grep --color=always

Vagy imigy, egyben az egesz. 

grep --color=always -i "text" /path/*.txt | sed -e 's|^/.*/||g'

Ez sem teljesen tokeletes, mert a root-ban levo fileok eseten nem vagja ki a /-t, de... de talan jo lesz :)

nem pont az, amit szeretnél, de esetleg:
ack ákombákom

grep -i "ákombákom" /path/path1/path2/path3/*.txt | awk -F'/' '{printf $5}'
Bár ebben az esetben elveszti a színeket.

Ki kell íratni a $1 -t is, mert ő tartalmazza a színkódot:

grep -H --color=always -i "ákombákom" /path/path1/path2/path3/*.txt | awk -F/ '{print $1 $NF}'

Nem értem ezt a fetisizmust, színeket is akarsz, meg útvonal se legyen a fájl előtt. Most miért fáj az neked, ha van útvonal? Elvileg még hasznos is, mert nem biztosan lesz minden fájl azonos mappaszinten. Ez a színmánia se ad hozzá semmit, fájlokat keresel, megtalálod szín nélkül is, miután már tudod melyik fájlban van, úgyse a színeket fogod nézegetni, hanem a fájl tartalmát, azzal fogsz tovább dolgozni.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Idézet tőlem: "Szeretnék rákeresni egy szóra vagy szövegrészletre ezekben a fájlokban." Nem fájlokat keresek. Nem útvonalakat keresek. Azt szeretném tudni hogy az adott szöveg melyik fájl(ok)ban van jelen.

És hogy miért színes? Csak. Hogy legyen mit kérdezned. Én még a man-t is megszíneztem, mert utálom ha minden összefolyik. A promptom is színes, hogy elkülönüljön az eredményektől. 
A te hozzáállásoddal Herkules monitorom is lehetne, mert minek a szín? Az információ úgyis látszik. Bár az is zöld. A fene enné meg. A Googlet is be kell perelni mert szemét LMBTQ propagandista a szivárványos logójával.
Az Ecosia meg zöld fákat ültet. Csak fekete-fehérben akarom látni 2 bitesen a világot. Szürke sem kell. 

Nem vicces. Gondolj bele. Egy szinten túl fetisizmus. Igen, én is színekkel használok mindent, minden utasítás, alias --color=always kapcsolóval van megspékelve, a man, ls meg minden más is úgy van állítva, hogy színes legyen a kimenet, még a less is úgy van aliasolva, hogy használja az -r kapcsolót, ha színes bemenetet kap, maradjanak meg a színek. Sőt, nálam nem csak hogy vannak színek, de truecolor megjelenítés van beállítva mindenhol, 24 bites színkódokkal. Az összes TUI alkalmazásom is színes, saját témával jönnek, az összes fájlkezelő, levelező, lejátszó, nvim, htop, stb.. A PS1 is színezve van. De! Ha pipe-olni kell, vagy szkriptbe lesz, ott nem érdekel, hogy a színe megmaradjon. Ez nem is célja ezeknek az eszközöknek. Ezeknek információt nyerni a feladatuk.

Igen, lehetne egyébként sed-del utánszínezni a kimenetet, hogy minden sor elejétől a rá követező első : karakterig betesz egy \e[38;2;r;g;bm (r,g,b 0-255) vagy \033[38;2;r;g;bm színkódot, amit a : után kikapcsolni \e[0m hozzáadásával. De nem szenvednék vele azért, hogy egy útvonal lerövidüljön. Vagy elfogadnám, hogy útvonallal van a fájlnév, vagy azt, hogy ez most az egyszer fekete-fehér lesz, istenem, nem a világnak a vége. Hányszor is kell egy ilyet futtatni? Gondolom nem egész nap. Vagy ha annyira fetisiszta, akkor ott van rá a lolcat-be pipe-olás.

A vicces az az, hogy a mappába cd-zés az megint smafu, arról nem tudta a kolléga elmondani, hogy mi a baj vele.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Egyrészt időnként komolyan nem értelek. Mi a fenéért zavar téged, hogy valaki meg akarna nézni valamit úgy, hogy ne vesszen ki belőle a szín, csak azért mert átpipeolta valamin? Meg mi a fenéért zavar, hogy le akarja szedni az elejét? Gondolom nézne valamit szemmelverésre, és kényelmesebb volna. És mivel gondolta, hogy ez linux, ezért biztos van rá egysoros. :)

Másrészt, azt azért még mindig igazán jól megy, hogy ne lásd az erdőt. Kézzel utánszínezni, meg lolcat, azt. Baszki, nem az a lényeg, hogy valami színe legyen, hanem hogy megmaradjon a grep által odaszínezett "ez itt a match", hogy könnyebb legyen szemmel verni.

Harmadrészt, meg te jössz azzal, hogy valami egy szinten túl fetisizmus? Te aki egyszer előadtad, hogy hát max meg kell jegyezni, hogy melyik nem egymás mellett levő karaktereket kell beírni egy névből, hogy előhozza az fzf, mert az úgy felhasználóbarát, ellenben az akármivel, ami guis? Ne már baszki, hát röhög a vakbelem :D

A vicces az az, hogy a mappába cd-zés az megint smafu, arról nem tudta a kolléga elmondani, hogy mi a baj vele.

Csupán annyi hogy nem a home könyvtáramban van az amit keresek, és sok macera lenne be cd-zni oda hogy ott adjam ki a parancsot. Ennél egyszerűbb megoldást kerestem.
Az sem járja ha scriptbe írom és belépek meg kilépek hogy visszakapjam azt a helyet ahol indultam. A zárójeles alshell vagy mi megoldást nem ismerem.
Sőt továbbmegyek még mindig tisztthatnám a kódot egy + sed-del. Nem tudod hogy mit szeretnék elérni, én meg nem biztos hogy mindent fel akarok tárni a nagyérdemű előtt. Ezért kicsit homályosabban fogalmazok. Nézd el nekem.

A lényeg hogy a txt fájlok valamiféle adatbázist tartalmaznak. Nem, nem igazi mysql meg mariadb dolgokat, mert nem valószínű hogy azt sima szövegszerkesztővel meg tudnám tekinteni. S néha kívánatos a telefonomon is megnézni ha keresek valamit. Ott természetesen a dokumentum megjelenítőben a sima szöveg keresést választom. Viszont ebben az esetben minden egyes fájlban külön rá kell keresnem.

Viszont a PC-n egyszerre tudok keresni az összes fájlban. S azért kell a színes kiemelés hogy elkülönüljön a szövegkörnyezettől. Ez az adatbázis automatikusan generált és tree szerkezetű. A kósza vonalak is megjelennek amiket kiírthatnék. 

file1.txt:1502:│   │   │   ├── nem releváns ákombákom a szélben valami blabla
file3.txt:1520:│   │   │   └── nem releváns2 ákombákom a viharban valami blabla
 

A file1.txt jelzi hogy melyik fájlban található abban is hányadik sorban. A vonalak a tree szerkezet maradványai. S az ákombákom szót kerestem. 
Itt mi legyen színes? Ha az ákombákom az, akkor az már elég. A jelenlegi szkriptemmel a fent jelzett módon jelenik meg. S nem nem fájlokat keresek!! Nem is dolgozom velük. Csak a szöveget keresem és azt szeretném tudni hogy melyik fájlban található.

A script:

#!/bin/bash

searchFolder="/path/path1/path2/path3/path4/path5"
printf "Mit keressek? "
read answer
grep --color=always -Hin "${answer}" "${searchFolder}"/*.txt | awk -F '/' '{print $1 $NF}'

Vagy csak:
cd -

Ez visszavisz az előző mappába, ahonnan a szkript indult. Sok megoldás van erre, akár a favágó:
OLDPWD="$PWD"
cd /bla/bla
cd "$OLDPWD"

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Scriptben én nem használnék `cd -`-t. Az csak szimplán egy `cd "$OLDPWD"` és az OLDPWD az írható változó.

~ $ cd /tmp/
/tmp $ OLDPWD=/root
/tmp $ cd -
bash: cd: /root: Engedély megtagadva

A második példádban nem is kell az OLDPWD="$PWD" sor, a `cd /bla/bla` után automatikusan be is állítja a shell (legalábbis a bash). Ha két cd parancsot adsz ki akkor máshova fog mutatni mint amire számítasz.

Akkor már inkább pushd és popd, ha a `( cd /ide; ..... )` forma nem jó valami egyéb ok miatt.
 

Jé, és tényleg. Pedig ki is próbáltam shellben, de nem váltottam mappát, ezért nem létezett az OLDPWD. Ha váltok, akkor valóban létezik. Ezt szeretem a shellben, még sok év után is tanul az ember ilyen apróságokat.

A pushd, popd-t ismerem, csak az nem jutott eszembe, hogy valóban az is megoldás. Nekem sose állt kézre, de kétségtelen működik az is.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Jó, de pont itt szólod el magad, hogy nem tudod melyik mappákban van a keresett fájl, hány mappa mélyen, ergo pont ezért lenne hasznos, ha nem beleznéd ki a grep kimenetében az elérési utakat. Igen, értem, a megtalált szöveg a fontos, nem az, hogy az melyik fájlban van, de akkor meg grep -h.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

1.

A zárójeles alshell vagy mi megoldást nem ismerem.

Ezt a parancsot akarod futattni:

grep ... | awk ...

Csak épp jobb lenne ha odamennél, ahova kell. Ekkor e fenti helyett annyit csinálsz, hogy

( cd akárhova ; grep ... | awk ... )

Kész van. Nincs mit megtanulni. Oda kell tenni a zárójeleket.

2.

S nem nem fájlokat keresek!! Nem is dolgozom velük. Csak a szöveget keresem és azt szeretném tudni hogy melyik fájlban található.

Speciel ha jobban figyelek olvasás közben, akkor nekem mégis csak az jön le belőle, hogy adott fájlok nevét keresed, amiben ott van az ákombákom. (Az általam vastagított és aláhúzott részeket figyeld!) Ebben az esetben én simán használnám a grep millió éve meglevő -l (kis el) opcióját. Részlet a manualból:

Only the names of files containing selected lines are written ....

Az tény, nem lesz színes, meg maga az ákombákom, vagy épp az ezt tartalmazó sor sem jelenik meg - de talán mégis ez kell neked.

Ha nem, akkor viszont fogalmazd meg másként a feladatot.