2011-01-17 13 views
6

Potrzebuję uzyskać wiersz oparty na wartości kolumny, podobnie jak zapytanie do bazy danych. Mam wyjście polecenia takiego,Filtrowanie wyjściowego polecenia dla systemu Linux

Nazwa ID Mem VCPUs State
raz (y)

Domain-0 0 15485 16 R ----- 1779042,1

prime95-01 512 1
-b ---- 61,9

Tutaj muszę wymienić tylko te wiersze, w których stan jest "r". Coś takiego,

Domain-0 0 15485 16
r ----- 1779042,1

Próbowałem za pomocą "grep" i "awk", ale nadal nie jestem w stanie odnieść sukces .

Proszę mi pomóc w tej sprawie.

Pozdrawiam, Raaj

Odpowiedz

2

try:

awk '$5 ~ /^r.*/ { print }' 

Jak to:

cat file | awk '$5 ~ /^r.*/ { print }' 
+0

Wielkie dzięki. Pomogło to rozwiązać mój problem. – Raajkumar

+3

@Raajkumar: Witamy w StackOverflow. Poświęć chwilę, aby przeczytać tę sekcję o tym, jak mówimy "wielkie dzięki" tutaj: http://stackoverflow.com/faq#howtoask – Johnsyweb

+0

@Raajkumar - tldr zaakceptuj odpowiedź i awansuj, jeśli chcesz – Ben

6

Jest variaty narzędzi dostępnych do filtrowania.

Jeśli chcesz tylko linie z "r" ----- grep jest więcej niż wystarczająco:

command | grep "r-----" 

lub

cat filename | grep "r-----" 

Cytaty są opcjonalne, ale może zapobiec grep potknięcia nad - jest rozwiązanie

+0

"Cytaty są opcjonalne, ale może zapobiec grepowi potykającemu się o "Są". Ale nie będą. – Johnsyweb

0

grep:

command | grep -E "^([^ ]+){4}r" 

Co to oznacza (-E włącza rozszerzone wyrażenie regularne):

Pierwsza kreska (^) dopasowuje początek linii. [^] dopasowuje dokładnie jedno wystąpienie znaku spacji, a następujący modyfikator (+) pozwala mu również dopasować więcej wystąpień.

Pogrupowane razem z końcową spacją w ([^] +), pasuje do dowolnej sekwencji znaków spoza przestrzeni, po której następuje pojedyncza spacja. Modyfikator {4} wymaga czterokrotnego dopasowania tego konstruktu.

Pojedynczy "r" jest wtedy literałem, którego szukasz.

W prostych słowach można to zapisać w następujący sposób: "Jeśli linia zaczyna się < ^> z czterema łańcuchami, po których następuje spacja < ([^] +) {4}>, a następny znak to linia dopasowana do linii .. "

Bardzo dobre wprowadzenie do wyrażeń regularnych został napisany przez Jana Goyvaerts (http://www.regular-expressions.info/quickstart.html)

2

grep może obsłużyć to dla ciebie:

yourcommand | grep -- 'r-----' 

jest to często przydatne, aby zapisać (pełną) wyjście do pliku analizować później. do tego używam tee.

yourcommand | tee somefile | grep 'r-----' 

Jeśli chcesz fi II linia zawierająca „-b ----” trochę później bez ponownie uruchomiony yourcommand, można po prostu użyć:

grep -- '-b----' somefile 

Nie potrzeba cat tutaj!

Polecam oddanie -- po wywołaniu grep od wzorców zawierać minus oznaki i jeśli minus-znak jest na początku wzorca, będzie to wyglądać argument opcji do grep zamiast części wzoru .

+0

@downvoter: Dlaczego? – Johnsyweb

+1

To nie działa – Tyguy7

+0

Która część nie działa? Zrobił to, kiedy napisałem to prawie siedem lat temu, ale chętnie zaktualizuję go, jeśli potrafisz wskazać błąd. – Johnsyweb

0

Filtrowanie przez cmd awk w linux: -

Po pierwsze znajdź kolumnę dla tego cmd i przechowywania plik2: -

awk '/ Domain-0 0 15485 /' plik1> plik2

wyjściowa: -

Domain-0 0 15485 16 r ----- 1779042,1

po że cmd awk pliku2: -

awk {drukowania $ 1 $ 2 $ 3 $ 4 "\ N", $ 5 $ 6} ' plik2

Wyjście końcowe: -

Domain-0 0 15485 16

r ----- 1779042.1

Powiązane problemy