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?
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
