Boj s grepem

Boj s grepem
« kdy: 02. 01. 2020, 15:47:16 »
Ahoj, asi jsem si zvolil špatnou utilitu, ale když už to mám rozdělané, dodělal bych to v grepu.

Mám dlouhý seznam vygrepnutých výsledků, ale jde mi o to, že tam mám například pomocí -A více řádků pro záznam. Potřeboval bych to proparsovat dále jak potřebuji, někam přidat data, sloučit výsledky a podobně.

Pokud bych použil grep whole read line, zase se mi to rozpadne na víc řádků i pro jeden výsledek. Dá se nějak vstoupit do toho cyklu, kterým grep prochází a po každém matchnutí provést vlastní kód?

Děkuji.


RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:Boj s grepem
« Odpověď #1 kdy: 02. 01. 2020, 16:07:16 »
Po matchnuti provest kod... bude umet spis SED nez GREP.

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re:Boj s grepem
« Odpověď #2 kdy: 02. 01. 2020, 16:12:43 »
Jestli to, co leze z grepu je použitelné, tak to propajpuj dál do SEDu či ještě spíš AWKu (komplexnější věci se dělaj líp v něm).Grep na to použít imho nejde a pro tydle linuxové utility je normální jich pár "propajpovat".

Ale jestli je to složitější práce s textem, možná bude pro Tebe ve výsledku nejjednodušší to postprocessnout v pythonu či perlu.


Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Boj s grepem
« Odpověď #3 kdy: 02. 01. 2020, 16:44:52 »
Tady bych byl pro přesedlání na AWK, které to může zvládnout vše naráz i s tím původním grepováním. Pro analýzu logů se mi osvědčilo lépe než grep.

Re:Boj s grepem
« Odpověď #4 kdy: 02. 01. 2020, 16:46:47 »
Taky bych to viděl na ten awk, ten je na to stavěný.
(pokud nechceš programovat úplně celé flow - vstup, zpracování, výstup -  třeba v tom pythonu)


gilll

Re:Boj s grepem
« Odpověď #5 kdy: 02. 01. 2020, 16:55:09 »
nastav jako oddělovač konce řádku '--' (jedno v čem), potom můžeš zpracovávat výstupy grep -A najednou

gilll

Re:Boj s grepem
« Odpověď #6 kdy: 02. 01. 2020, 18:17:33 »
Taky bych to viděl na ten awk, ten je na to stavěný.
(pokud nechceš programovat úplně celé flow - vstup, zpracování, výstup -  třeba v tom pythonu)

U všeho s vyjímkou nejtriviálnějších úloh s awk narazí.

Re:Boj s grepem
« Odpověď #7 kdy: 02. 01. 2020, 18:28:56 »
Na praci s textem doporucuju PERL, byl pro tyto ucely vyvinut.

Priklad z webu:

Kód: [Vybrat]
use strict;
use warnings;
 
die "Usage: $0 FILENAMEs\n" if not @ARGV;
foreach my $file (@ARGV) {
    open my $fh, '<:encoding(UTF-8)', $file or die;
    while (my $line = <$fh>) {
        if ($line =~ /REGEX/) {
            print $line;
        }
    }
}

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Boj s grepem
« Odpověď #8 kdy: 02. 01. 2020, 18:47:43 »
Taky bych to viděl na ten awk, ten je na to stavěný.
(pokud nechceš programovat úplně celé flow - vstup, zpracování, výstup -  třeba v tom pythonu)
U všeho s vyjímkou nejtriviálnějších úloh s awk narazí.

Vůbec netušíme, jakou úlohu vlastně řeší, takže tohle stanovisko je předčasné. Jistě, AWK narazí třeba i při zpracování CSV a podobných špeků, ale proč ho hned zavrhovat? Používám ho často a rád.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Boj s grepem
« Odpověď #9 kdy: 02. 01. 2020, 18:51:26 »
Na praci s textem doporucuju PERL, byl pro tyto ucely vyvinut.

Priklad z webu:

Kód: [Vybrat]
use strict;
use warnings;
 
die "Usage: $0 FILENAMEs\n" if not @ARGV;
foreach my $file (@ARGV) {
    open my $fh, '<:encoding(UTF-8)', $file or die;
    while (my $line = <$fh>) {
        if ($line =~ /REGEX/) {
            print $line;
        }
    }
}

Proč tak složitě? Perl to umí i mnohem elegantněji, tohle je spíš úloha pro oneliner.

gilll

Re:Boj s grepem
« Odpověď #10 kdy: 02. 01. 2020, 19:25:14 »
Na praci s textem doporucuju PERL, byl pro tyto ucely vyvinut.

Priklad z webu:

Kód: [Vybrat]
use strict;
use warnings;
 
die "Usage: $0 FILENAMEs\n" if not @ARGV;
foreach my $file (@ARGV) {
    open my $fh, '<:encoding(UTF-8)', $file or die;
    while (my $line = <$fh>) {
        if ($line =~ /REGEX/) {
            print $line;
        }
    }
}

ten kód souvisí s otázkou jak?

jak píše Kit, výstup grep -A jde zpracovat onelinerem
Kód: [Vybrat]
grep -A 5 neco | perl -lne 'BEGIN {$/ = "--\n"} @lines = split /\n/; '

gilll

Re:Boj s grepem
« Odpověď #11 kdy: 02. 01. 2020, 20:29:35 »
splitování lze zařídit i parametrem -F

Kód: [Vybrat]
grep -A 5 neco | perl -F'\n' -lne 'BEGIN {$/ = "--\n"} print $F[0]'

Re:Boj s grepem
« Odpověď #12 kdy: 03. 01. 2020, 09:56:30 »
Taky bych to viděl na ten awk, ten je na to stavěný.
(pokud nechceš programovat úplně celé flow - vstup, zpracování, výstup -  třeba v tom pythonu)

U všeho s vyjímkou nejtriviálnějších úloh s awk narazí.
Hmmm, tak to je úžasný závěr.

Re:Boj s grepem
« Odpověď #13 kdy: 03. 01. 2020, 10:35:00 »
Grep s akciou pre každý nájdený riadok je awk.

Napríklad „Nájdi riadky začínajúce na "root" a vypíš ich so štyroma nasledovnými riadkami“, resp. emulácia GNU grep -A:

Kód: [Vybrat]
awk '/^root/ { for(i=0; i<5; i++) { print; getline; }}' /etc/passwd

Napríklad „Skupiny z grep -A oddelené dvoma pomlčkami dajte na jeden riadok“

Citace
grep -A1 root /etc/passwd | awk '/^--/ { print BUF; BUF=""; next } { BUF = BUF $0 } END { print BUF }'

Resp. plný skript v awk:

Citace
/^--/ {
  print BUF
  BUF=""
  next
}
{
  BUF = BUF $0
}
END {
  print BUF
}
- Druhé pravidlo nalepí každý riadok do buffera BUF.
- Prvé pravidlo vraví, že ak na začiatku riadku sú dve pomlčky --, vyprintuje obsah buffera a vymaže buffer.
- Tretie pravidlo vyprintuje obsah buffera na konci súboru.

gilll

Re:Boj s grepem
« Odpověď #14 kdy: 03. 01. 2020, 11:14:20 »
Grep s akciou pre každý nájdený riadok je awk.

Napríklad „Nájdi riadky začínajúce na "root" a vypíš ich so štyroma nasledovnými riadkami“, resp. emulácia GNU grep -A:

Kód: [Vybrat]
awk '/^root/ { for(i=0; i<5; i++) { print; getline; }}' /etc/passwd

Napríklad „Skupiny z grep -A oddelené dvoma pomlčkami dajte na jeden riadok“

Citace
grep -A1 root /etc/passwd | awk '/^--/ { print BUF; BUF=""; next } { BUF = BUF $0 } END { print BUF }'

Resp. plný skript v awk:

Citace
/^--/ {
  print BUF
  BUF=""
  next
}
{
  BUF = BUF $0
}
END {
  print BUF
}
- Druhé pravidlo nalepí každý riadok do buffera BUF.
- Prvé pravidlo vraví, že ak na začiatku riadku sú dve pomlčky --, vyprintuje obsah buffera a vymaže buffer.
- Tretie pravidlo vyprintuje obsah buffera na konci súboru.

přesně to co hawran nechce

pokud nechceš programovat úplně celé flow - vstup, zpracování, výstup

v perlu se obejdete bez explicitního čtení, printování, smyček. Ten příklad se spojením na jeden řádek by vypadal takto

Kód: [Vybrat]
grep -A1 root /etc/passwd | perl -lpe 'BEGIN {$/ = "--\n"} s/\n/ /g'