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 не то, что я ищу, но как это сделать с "вырезать"?



спасибо.

696   12  

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

http://arielf.github.io/cuts/

и даже короче (не используя вырезать вообще) является:

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

    Ничего не найдено.