2013-08-06 16 views
5

pojawia się następujący komunikat kiedy zrobić "ps -ef | portu grep"analizowania ps i grep wyjście w powłoce

apache 6215  1 0 11:20 ?  00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8 

Czy istnieje sposób, aby przeanalizować następujące:

  • początek czas (11:20)
  • sn (4123E)
  • sku (HSME01-HW)
  • portu (8)
+3

"grep" nie powinien być w tytule, ale to nie jest powód, aby -1 nowicjusz zamiast odpowiadać na jego pytanie! – saeedgnu

+0

Jest to raczej kwestia "na ile różnych sposobów można parsować wyniki", niż "czy jest sposób, aby to zrobić". –

+0

Możesz znaleźć 'ps -eo start_time, args' nieco łatwiejsze do parsowania –

Odpowiedz

7

Można użyć awk zarówno dla filtrowania i analizowania:

ps -ef | awk '/[p]ort/ {printf "start time: %s\nsn: %s\nsku: %s\nport: %s\n", $5, $11, $13, $NF}' 

Jak podkreślił Glenn Jackman w komentarzach nawiasy kwadratowe w ciągu filtru uniemożliwiają wyrażenie dopasowania do samego ciągu filtrującego na liście procesów.

+2

Ponieważ to może również wybrać polecenie awk z wyjścia ps, użyj'/[p] ort/'do filtrowania –

+0

@glennjackman Good point. Naprawiony. –

+0

Dzięki Ansgar. Czy ktoś mógłby mi wytłumaczyć, co oznacza 5 USD, 11 USD, 13 USD, NF lub które odpowiadają? – Jeremy

3

Ponieważ pytanie jest oznaczone jako bash, stosując roztwory bash-only (bez awk lub perl) jest korzystne ...

LINE='apache 6215  1 0 11:20 ?  00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8' 

## Convert string to bash array 
ARR=($LINE) 

echo "start time (${ARR[4]})" 
echo "sn (${ARR[10]})" 
echo "sku (${ARR[12]})" 
echo "port (${ARR[14]})" 

## How to save the value? 
START_TIME=${ARR[4]}