Sida 1 av 1

grep -B fråga

Postat: 14 jan 2009, 12:46
av BadOmen
Jag hade för mig att -B gjorde att man kan sätta ut antal rader före ett sökord som man vill visa, -B n 'string'. Men det verkar som att den gruperar på nåt sätt.
Jag måste göra så här för att få ut det jag vill ha:

Kod: Markera allt

# Define a groovy word - USAGE: define lamer
    define ()
    {
 lynx -dump "http://www.google.com/search?hl=en&q=define%3A+${1}&btnG=Google+Search" | grep -A 500 "Definitions of" | grep -v [[] | grep -B 500 "Search" | grep -v "Search"| grep -B 500 "Referenser" | grep -v "Referenser" | less
    }
sidan ser ut så här, typ.

...
Definitions of
...
Search
...
Referenser
...

Jag söker upp "Definitions of" och 500 rader nedåt för att vara säker på att få med hela sidan. Sedan söker jag reda på Search och tar de 500 hundra raderna ovanför den raden. Då borde allt som fanns under Search ha försvunnit inklusive Referenser men det gör det inte utan jag måste göra en ny sökning efter Referenser och ta de 500 raderna före det också.
- V använder jag för att ta bort raden Search och Referenser samt några rader med länkar som börjar med [ och det funkar bra.

Kan nån förklara vad jag har gjort fel eller hur -B egentligen funkar?

Re: grep -B fråga

Postat: 14 jan 2009, 15:38
av David Andersson
BadOmen skrev:Kan nån förklara vad jag har gjort fel eller hur -B egentligen funkar?
-B och -v funkar som du säger. Men tänk på att i varje steg i pipen så blir output mindre och mindre.

Struktur på output från lynx. Radnummer ej del av output.

1 ...
2 Definitions of
3 ...
4 Find definitions ... [...]
5 ...
6 Search
7 ...
8 References
9 ...

Omformatterad kommandorad, kortare url. Ändrat "Referenser" till "References".

Kod: Markera allt

 lynx -dump "http://google.com/search?q=define%3A+${1}" |   (allt 1-9)
 grep -A 500 "Definitions of" |                             (kvar 2-9)
 grep -v "[[]" |                                            (kvar 2-3,5-9)
 grep -B 500 "Search" |                                     (kvar 2-3,5-6)
 grep -v "Search" |                                         (kvar 2-3,5)
 grep -B 500 "References" |                                 (kvar inget)
 grep -v "References" |                                     (kvar inget)
 less
Parenteser efter varje rad är inte del av kommandot. De visar vad som blir output från respektive kommando. Ta bort parenteserna om du ska köra kommandona.

Tre alternativ

I stället för grep kan man använda awk. Parenteserna efter # är kommentarer. Behöver inte tas bort.

Kod: Markera allt

 lynx -dump "http://google.com/search?q=define%3A+${1}" |
 awk '
    /Definitions of/,/^$/     # (ta med 2-3)
    /References/,0            # (ta med 8-9)
 ' |
 grep . |
 less
Den sista "grep ." är för att ta bort tomrader.

I stället för awk kan man använda perl.

Kod: Markera allt

 lynx -dump "http://google.com/search?q=define%3A+${1}" |
 perl -ne 'BEGIN{$/=""} print if /Definitions of/ or /References/ or / 1\. /' |
 less
$/="" gör att perl bearbetar strömmen i paragraf-sjok (textstycken omgivna av tomrader, annars by default berabetar den strömmen rad för rad). Den printar alla sjok som innehåller "Definitions of", "References" och " 1. " (sjoket med referenser).

I stället för perl kan man använda sed. Men vet inte hur utantill. Se man sed.

Re: grep -B fråga

Postat: 14 jan 2009, 19:18
av BadOmen
Tack för svaret och att du gav mig flera val =)

Jag tycker då att det skulle räcka med den här koden:

Kod: Markera allt

    lynx -dump "http://www.google.com/search?hl=en&q=define%3A+${1}&btnG=Google+Search" | grep -A 500 "Definitions of" | grep -v [[] | grep -B 500 "Search" | grep -v "Search" | less
men då kommer fortfarande Referenser med som är under Search. (Jag skriver Referenser då det är vad rubriken heter, det står på svenska.) Jag tycker inte det borde göra det och jag tycker det ser ut som om du också tycker att Referenser inte skulle kunna komma med om jag gjort som ovan. Koden som jag skrev i mitt första inlägg funkar men den ser ut att vara onödigt lång. Koden här ovan visar även Referenser av nån anledning.

Jag blev lite sugen på att prova på awk:

Kod: Markera allt

lynx -dump "http://google.com/search?q=define%3A+${1}" |
awk '
    /Definitions of/,/^$/     # (ta med 2-3)
  #  /Referenser/,0            # (ta med 8-9)
' |
grep -v [[]  |
less
Jag har tagit bort grep . som skulle ta bort tomma rader för jag såg inte att den gjorde nån skillnad och gör inte /Definitions of/,/^$/ så att det stycket som börjar med "Definition of" tas med och den kan väll inte innehålla nån tom rad för då skulle "stycket" sluta där. Jag av markerade också Referenser för det är jag inte intresserad av att visa. Blev dock lite nyfiken på vad ,/^$ gör, tar den allt tills en tom rad dyker upp eller gör den att den tar fram till slutet på varje rad?
Och av ren nyfikenhet vad gör då /,0

Hur kan jag göra en sökning med awk efter rader som börjar med ett [ tecken?

EDIT: lade till sista frågan...

Re: grep -B fråga

Postat: 15 jan 2009, 02:56
av Konservburk
David Andersson skrev:I stället för perl kan man använda sed. Men vet inte hur utantill. Se man sed.
Borde bli typ så här (med din awk-kod som utgångspunkt):

Kod: Markera allt

lynx -dump "http://google.com/search?q=define%3A+${1}" |
sed -n '
    /Definitions of/,/^$/p
    /References/,$p
'

Re: grep -B fråga

Postat: 15 jan 2009, 03:03
av Konservburk
BadOmen skrev:Blev dock lite nyfiken på vad ,/^$ gör, tar den allt tills en tom rad dyker upp eller gör den att den tar fram till slutet på varje rad?
/^$/ är slutvillkoret, i det här fallet en tom rad.
BadOmen skrev:Och av ren nyfikenhet vad gör då /,0
Nu är slutvillkoret 0 som alltid är falskt, vilket innebär att den inte slutar förrän den kommit till slutet.
BadOmen skrev:Hur kan jag göra en sökning med awk efter rader som börjar med ett [ tecken?

Kod: Markera allt

awk '/^[[]/'

Re: grep -B fråga

Postat: 15 jan 2009, 11:15
av micke_nordin
En liten sidonot bara, ibland har jag märkt att man får bättre/mer stabilt resultat av att använda lynx -source i stället för lynx -dump, det dumpar html-koden till stdout i stället för texten på sidan. Man måste då förstås skriva om skriptet så att det hanterar html-koden på rätt sätt.

/Micke

Re: grep -B fråga

Postat: 15 jan 2009, 18:59
av BadOmen
Tack så mycket för alla era förklaringar, de var tydliga =)