Есть ли способ указать разделитель полей для большего количества пробелов командой cut? (как "" +)? Например: в следующей строке мне нравится достигать значения «3744», какой разделитель я должен сказать?
$ps axu | grep jboss
jboss 2574 0.0 0.0 3744 1092 ? S Aug17 0:00 /bin/sh /usr/java/jboss/bin/run.sh -c example.com -b 0.0.0.0
cut -d' '
это не то, что я хочу, потому что это только для одного места.
awk
это не то, что я ищу, но как сделать с «вырезать»?
Спасибо.
tr
как показано здесь: stackoverflow.com/a/4483833/168143ps
+grep
вы можете использовать тот,pgrep
который доступен в большинстве современных дистрибутивов. Он вернет результат именно в той форме, в которой он вам нужен.Ответы:
На самом деле
awk
это именно тот инструмент, который вы должны изучить:или вы можете угробить
grep
всего, так какawk
знает о регулярных выражениях:Но если по какой-то причудливой причине вы действительно не можете использовать
awk
, есть и другие более простые вещи, которые вы можете сделать, например, сначала свернуть все пробелы в один пробел:Который
grep
трюк, кстати, является аккуратным способом получить толькоjboss
процессы, а неgrep jboss
один (то же самое дляawk
варианта).grep
Процесс будет иметь буквальныйgrep [j]boss
в своей команде процесса , так не будет пойманgrep
сам по себе, который ищет класс персонажа[j]
следуетboss
.Это отличный способ избежать
| grep xyz | grep -v grep
парадигмы, которую используют некоторые люди.источник
grep
Трюк , кажется, не работает в кронтаб - файлов. Любая причина?awk
Возможно, лучше всего использовать версию, но вы также можете использовать ее,cut
если сначала сожмите повторы с помощьюtr
:источник
tr -s ' '
очень хорошо! Я надеюсь, что я могу помнить это лучше чемawk
Мне нравится использовать команду tr -s для этого
Это сжимает все пробелы до 1 пробела. Таким образом, указание вырезать использование пробела в качестве разделителя считается ожидаемым.
источник
Я собираюсь назначить
tr -s [:blank:]
лучшим ответом.Почему мы хотим использовать вырезать? У него есть магическая команда, которая говорит: «мы хотим, чтобы третье поле и каждое поле после него, пропуская первые два поля»
Я не верю, что есть эквивалентная команда для awk или perl split, где мы не знаем, сколько будет полей, т.е. пропустим 3-е поле через поле X.
источник
Короче / более простое решение: использовать
cuts
(вырезать на стероидах, которые я написал)Обратите внимание, что
cuts
индексы полей начинаются с нуля, поэтому 5-е поле указано как 4http://arielf.github.io/cuts/
И даже короче (не используя вырезать):
источник
Один из способов обойти это:
заменить несколько последовательных пробелов одним.
источник
\s
является расширением GNU sed. В OS X вы можете передать-E
флаг sed, чтобы включить расширенные регулярные выражения, а затем использовать[[:space:]]
вместо него\s
, например, так:sed -E 's/[[:space:]]+/ /g'
Лично я склонен использовать awk для таких работ. Например:
источник
ps axu | awk '/[j]boss/ {print $5}'
.В качестве альтернативы всегда есть perl:
Или, если вы хотите получить все поля, начиная с поля № 3 (как указано в одном из ответов выше):
источник
lsof
я пыталсяlsof|perl -lane 'print $F[5]'
это иногда получает 5-й столбец, иногда 6-йЕсли вы хотите выбрать столбцы из вывода ps, есть ли причина не использовать -o?
например
Минимальная выделенная ширина столбца, без заполнения, только один разделитель пробела.
Pid и vsz, учитывая ширину 10 символов, 1 разделитель пробелов.
Используется в сценарии: -
источник
Другой способ, если вы должны использовать команду вырезать
В Solaris замените awk на
nawk
или/usr/xpg4/bin/awk
источник
Мне все еще нравится, как Perl обрабатывает поля с пробелами.
Первое поле - $ F [0].
источник
Мой подход заключается в том, чтобы сохранить PID в файле в / tmp и найти правильный процесс, используя
-S
опцию дляssh
. Это может быть неправильно, но работает на меня.Лучшим подходом может быть запрос
SSH_PID
права перед его уничтожением, так как файл может устареть и уничтожить неправильный процесс.источник