2012-12-10 13 views
5

Zasadniczo mam linię z komendą ls -la:Jak zdobyć n-tą kolumnę z regexp separatora

-rw-r--r-- 13 ondrejodchazel staff 442 Dec 10 16:23 some_file 

i chcesz uzyskać rozmiar pliku (442). Próbowałem poleceń cut i sed, ale nie działałem poprawnie. Korzystając tylko z podstawowych narzędzi UNIX (cut, sed, awk ...), w jaki sposób mogę uzyskać konkretną kolumnę ze stdin, gdzie separator jest / +/ regexp?

Odpowiedz

12

Jeśli chcesz to zrobić z cut, najpierw musisz wycisnąć przestrzeń (tr -s ' '), ponieważ cut nie obsługuje +. To powinno działać:

ls -la | tr -s ' ' | cut -d' ' -f 5 

To trochę więcej pracy, gdy robi to z sed (GNU sed):

ls -la | sed -r 's/([^ ]+ +){4}([^ ]+).*/\2/' 

Nieco bardziej palec wykrawania jeśli używasz alternatywę grep (GNU grep):

ls -la | grep -Eo '[^ ]+(+[^ ]+){4}' | grep -Eo '[^ ]+$' 
+0

+1 dla "sed | odcięty przepływ. Zdecydowanie najbardziej elastyczna, potężna, zwięzła technika do grokowania kolumn. – gepoch

5

Parsowanie ls wyjście jest trudniejsze niż myślisz. Zamiast tego użyj dedykowanego narzędzia, takiego jak stat.

size=$(stat -c '%s' some_file) 

Jednym ze sposobów jest ls -la some_file | awk '{print $5}' może pęknąć, jeśli numery używać miejsca jako separator tysięcy (co jest powszechne w niektórych europejskich lokalizacjach).

Patrz także .

+1

Dzięki, twoja odpowiedź jest dobra, ale przetwarzanie danych wyjściowych w ls było raczej przykładem użycia, a następnie rzeczywistym użyciem. – Ondra

2

rur swoją moc z:

awk '{print $5}' 

lub nawet lepiej nam użyć polecenia stat tak (na Macu):

stat -f "%z" yourFile 

Albo (w systemie Linux)

stat -c "%s" yourFile 

które wyprowadzą rozmiar pliku w bajtach.