linux cut help-Как указать больше пробелов для разделителя?
есть ли способ указать разделитель полей для большего количества пробелов с помощью команды 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 не то, что я ищу, но как это сделать с "вырезать"?
спасибо.
12 ответов:
на самом деле
awk- это ровно инструмент, вы должны смотреть на:ps axu | grep '[j]boss' | awk '{print }'или вы можете бросить
grepвместе сawkзнает о регулярных выражениях:ps axu | awk '/[j]boss/ {print }'но если, по какой-то странной причине, вы действительно не могу использовать
awk, есть и другие более простые вещи, которые вы можете сделать, например, сначала свернуть все пробелы в один пробел:ps axu | grep '[j]boss' | sed 's/\s\s*/ /g' | cut -d' ' -f5
это
grepтрюк, кстати, есть аккуратный способ получить толькоjbossпроцессы, а неgrep jbossодин (то же самое дляawkвариант а).The
awkверсия это, вероятно, лучший способ пойти, но вы также можете использоватьcutЕсли вы сначала сожмете повторы сtr:ps axu | grep jbos[s] | tr -s ' ' | cut -d' ' -f5 # ^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^^ # | | | # | | get 5th field # | | # | squeeze spaces # | # avoid grep itself to appear in the list
Мне нравится использовать команду tr-s для этого
ps aux | tr -s [:blank:] | cut -d' ' -f3Это сжимает все пробелы до 1 места. Таким образом, указание вырезать использовать пробел в качестве разделителя выполняется должным образом.
один из способов обойти это:
$ps axu | grep jboss | sed 's/\s\+/ /g' | cut -d' ' -f3для замены нескольких последовательных пробелов на один.
Я собираюсь назначить
tr -s [:blank:]как лучший ответ.почему мы хотим использовать cut? У него есть волшебная команда, которая говорит: "Мы хотим третье поле и каждое поле после него, опуская первые два поля"
cat log | tr -s [:blank:] |cut -d' ' -f 3-Я не верю, что есть эквивалентная команда для awk или perl split, где мы не знаем, сколько полей будет, т. е. Поместите 3-е поле через поле X.
более короткое / простое решение: используйте
cuts(вырезать на стероидах я сделал)ps axu | grep '[j]boss' | cuts 4отметим, что
cutsиндексы полей основаны на нуле, поэтому 5-е поле указано как 4и даже короче (не используя вырезать вообще) является:
pgrep jboss
лично я склонен использовать awk для таких заданий. Например:
ps axu| grep jboss | grep -v grep | awk '{print }'
в качестве альтернативы всегда есть perl:
ps aux | perl -lane 'print $F[3]'или, если вы хотите получить все поля, начиная с поля #3 (как указано в одном из ответов выше):
ps aux | perl -lane 'print @F[3 .. scalar @F]'
другой способ, если вы должны использовать команду cut
ps axu | grep [j]boss |awk '='|cut -d' ' -f5в Solaris замените awk на
nawkили/usr/xpg4/bin/awk
Мне все еще нравится, как Perl обрабатывает поля с пробелом.
Первое поле - $F[0].$ ps axu | grep dbus | perl -lane 'print $F[4]'
мой подход заключается в том, чтобы сохранить PID в файл в /tmp и найти правильный процесс с помощью на
ssh. Это может быть неправильным, но работает для меня.#!/bin/bash TARGET_REDIS=${1:-redis.someserver.com} PROXY="proxy.somewhere.com" LOCAL_PORT=${2:-6379} if [ "" == "stop" ] ; then kill `cat /tmp/sshTunel${LOCAL_PORT}-pid` exit fi set -x ssh -f -i ~/.ssh/aws.pem centos@$PROXY -L $LOCAL_PORT:$TARGET_REDIS:6379 -N -S /tmp/sshTunel$LOCAL_PORT ## AWS DocService dev, DNS alias # SSH_PID=$! ## Only works with & SSH_PID=`ps aux | grep sshTunel${LOCAL_PORT} | grep -v grep | awk '{print }'` echo $SSH_PID > /tmp/sshTunel${LOCAL_PORT}-pidлучшим подходом может быть на запрос
SSH_PIDпрямо перед его убийством, так как файл может быть устаревшим, и это убьет неправильный процесс.
если вы хотите выбрать столбцы из вывода ps, любая причина не использовать -o?
например
ps ax -o pid,vsz ps ax -o pid,cmdминимальная выделенная ширина столбца, без заполнения, только один разделитель поля пространства.
ps ax --no-headers -o pid:1,vsz:1,cmd 3443 24600 -bash 8419 0 [xfsalloc] 8420 0 [xfs_mru_cache] 8602 489316 /usr/sbin/apache2 -k start 12821 497240 /usr/sbin/apache2 -k start 12824 497132 /usr/sbin/apache2 -k startпид и ВСЗ дали ширину 10 чар, 1 разделитель поля космоса.
ps ax --no-headers -o pid:10,vsz:10,cmd 3443 24600 -bash 8419 0 [xfsalloc] 8420 0 [xfs_mru_cache] 8602 489316 /usr/sbin/apache2 -k start 12821 497240 /usr/sbin/apache2 -k start 12824 497132 /usr/sbin/apache2 -k startиспользуется в скрипте: -
oldpid=12824 echo "PID: ${oldpid}" echo "Command: $(ps -ho cmd ${oldpid})"
Comments