В развитие предыдущего ответа:
awk
обрабатывает тесты истина/ложь численно; 0 - это "ложно", а любое другое число - "истинно". Восклицание (!
) меняет тест на противоположный.
Таким образом, !a[$1]
по сути эквивалентно тому, чтобы сказать: "Выведите, если a[$1]
равно 0".
Если ваш grep
- это GNU grep
, попробуйте параметр -o
:
ps aux |grep foo| grep -o 'foo[0-9]\+'
Со страницы руководства GNU grep
:
-o, --only-matching
Печатает только совпадающую часть строк.
Исходя из двух ваших требований (3 строчных буквы, за которыми следуют 5 цифр), это также должно работать:
ps aux | grep -o '[a-z]\{3\}[0-9]\{5\}'
Это более эффективно, поскольку при этом используется на одну трубу меньше.
Моим первым побуждением было бы использовать sed следующим образом:
ps aux | sed -n '/foo/s/.*\(foo[0-9]\{5\}\).*/\1/p'
Однако, поскольку данные будут структурированы в стандартное количество столбцов, вы можете вместо этого использовать cut:
ps aux | grep foo | cut -d ' ' -f 8
Если ваш grep
не является GNU grep
, вы всегда можете использовать Perl:
ps aux | perl -nle '/\s+([a-z]{3}[0-9]{5})\s+/ && print $1
или awk
], поскольку ваши поля уже разделены пробелами:
ps aux | awk '{ for(i=1;i<=NF;i++) if($i ~ /[a-z]{3}[0-9]{5}/) print $i }'