2013-03-12 15 views
5

Mam plik tekstowy zawierający tekst i numery, chcę użyć grep wyodrębnić tylko te numery muszę Przykładowo, jeżeli plik następująco:jak wyodrębnić podciąg i liczb tylko przy użyciu grep/sed

miss rate 0.21 
ipc 222 
stalls n shdmem 112 

Powiedzmy, że chcę tylko wyodrębnić dane dla miss rate, które są 0.21. Jak zrobić to z grep lub sed? Dodatkowo potrzebuję więcej niż jednego numeru, nie tylko tego po miss rate. Oznacza to, że mogę chcieć uzyskać zarówno 0.21 i . Przykładowe dane wyjściowe mogą wyglądać następująco:

0.21 222 112 

Przyczyna Potrzebuję danych do późniejszego wydruku.

+0

Polecam używanie sed zamiast grep, jeśli to działa dla ciebie –

+0

sed jest również do zaakceptowania, jeśli działa bardziej elegancko w tym przypadku. – Hooloovoo

Odpowiedz

3

Zastosowanie awk zamiast:

awk '/^miss rate/ { print $3 }' yourfile 

Aby to zrobić tylko z grep, trzeba niestandardowych rozszerzeń jak tu z GNU grep użyciu PCRE (-P) z dodatnim lookbehind (? < = ..) i mecz tylko (-o):

grep -Po '(?<=miss rate).*' yourfile 
0

można użyć:

grep -P "miss rate \d+(\.\d+)?" file.txt 

lub:

grep -E "miss rate [0-9]+(\.[0-9]+)?" 

Oba te polecenia będą drukować miss rate 0.21. Jeśli chcesz wyodrębnić tylko liczbę, dlaczego nie użyć Perla, Sed lub Awk?

Jeśli naprawdę chcesz tego uniknąć, może to zadziała?

grep -E "miss rate [0-9]+(\.[0-9]+)?" g | xargs basename | tail -n 1 
1

Jeśli naprawdę chcą używać tylko grep dla tego, to można spróbować:

grep "miss rate" file | grep -oe '\([0-9.]*\)' 

Będzie to pierwszy znaleźć wiersz, który pasuje, i to tylko wyjście cyfr.

Sed może być nieco bardziej czytelne, choć:

sed -n 's#miss rate ##p' file 
4

Korzystanie trick specjalny rozejrzeć regex \K z silnika z :

grep -oP 'miss rate \K.*' file.txt 

lub :

perl -lne 'print $& if /miss rate \K.*/' file.txt 
+0

Dodano przenośne rozwiązanie Perla =) –

+0

sztuczka \ K jest naprawdę pomocna. Tak, wolę grep, aby to zrobić, ponieważ nie jestem ekspertem od awk, a także z probą z awk jest separatorem pól, ponieważ tekst w jednym polu może mieć wiele różnych zakresów #, jak w 'wskaźniku brakującym XX' i 'całkowitym sumieniu numer XXX " – Hooloovoo

4

grep -i- cut rozwiązaniem będzie wyglądać następująco:

aby uzyskać pole 3rd dla każdego udanego wykorzystania grep:

grep "^miss rate " yourfile | cut -d ' ' -f 3 

lub uzyskania pola 3 i wykorzystanie rekreacyjne:

grep "^miss rate " yourfile | cut -d ' ' -f 3- 

Lub jeśli używasz bash i "miss rate" występuje tylko raz w twoim pliku, możesz również zrobić:

a=($(grep -m 1 "miss rate" yourfile)) 
echo ${a[2]} 

gdzie ${a[2]} to twój wynik.

Jeśli "wskaźnik chybienia" występuje więcej niż raz, można pętli na gre gre wynik tylko to, czego potrzebujesz. (W bash)

0

wierzę

sed 's|[^0-9]*\([0-9\.]*\)|\1 |g' fiilename

rade. Jednak każda pozycja będzie na własnej linii, jeśli jest w porządku. Jestem pewien, że istnieje sposób, aby sed wytworzył przecinek lub listę rozdzielaną spacjami, ale nie jestem super-mistrzem wszystkich rzeczy sed.

Powiązane problemy