cut을 사용하여 구분 기호에 더 많은 공간을 지정하는 방법은 무엇입니까?


196

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내가 찾고있는 것이 아니라 'cut'으로 어떻게 할 수 있습니까?

감사.


13
가장 좋은 대답은 다음 tr과 같이 사용합니다 : stackoverflow.com/a/4483833/168143
John Bachir

1
실제 질문에 직접 관련되지는 대신의 요청을 받고 ps+ grep당신이 사용할 수있는 pgrep가장 현대적인 배포판에서 사용할 수있다. 필요한 형식으로 결과를 정확하게 반환합니다.
ccpizza

답변:


323

사실 awk입니다 정확히 당신이에보고해야 도구 :

ps axu | grep '[j]boss' | awk '{print $5}'

또는 정규 표현식에 대해 알고 grep있기 때문에 완전히 버릴 수 있습니다 awk.

ps axu | awk '/[j]boss/ {print $5}'

어떤 이상한 이유로, 당신이 정말로,하지만 할 수없는 사용 awk, 붕괴 먼저 하나의 공간에 대한 모든 공백 같은 당신이 할 수있는 다른 간단한 일이있다 :

ps axu | grep '[j]boss' | sed 's/\s\s*/ /g' | cut -d' ' -f5

그건 grep그렇고, 그 트릭은 jboss프로세스를 얻는 것이 아니라 깔끔한 방법입니다 grep jboss( awk변형도 마찬가지입니다).

grep과정은 문자 그대로해야합니다 grep [j]boss그래서 자신의 프로세스 명령을에 의해 체포되지 않습니다 grep문자 클래스가 찾고있는 그 자체 [j]다음에 boss.

이것은 | grep xyz | grep -v grep일부 사람들이 사용 하는 패러다임 을 피하는 좋은 방법 입니다.


1
좋은 대답입니다. 다음에 필요할 때 다시 찾아 보도록하겠습니다.
funroll

grep트릭은 crontab 파일에서 작동하지 않는 것 같습니다. 어떤 이유?
Amir Ali Akbari

2
나는 그렙 트릭을 계속 배우고 잊어 버린다. 가장 최근의 알림에 감사드립니다. 아마 이번에는 달라 붙을 것입니다. 그러나 나는 그것에 내기하지 않을 것입니다.
Michael Burr

@Michael, 당신은 한 달에 한 번 당신에게 그 팁 (및 다른 사람)을 우편으로 보낼 수있는 cron 작업을 설정해야합니다 :-)
paxdiablo

3
올리버, 때로는 "Y로 X를 어떻게합니까?" "Y를 사용하지 말고 Z를 대신 사용하십시오"입니다. 영업 이익이 응답을 허용하기 때문에, 내가 그 :-) 그들을 설득 가능성이 높습니다
paxdiablo

113

awkversion은 아마도 가장 좋은 방법 일 것입니다.하지만 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

10
멋진 그림.
Haggra

tr -s ' '강하다! 그보다 더 잘 기억할 수 있기를 바랍니다awk
Chris

@Chris 나는 이의를 제기해야한다.
fedorqui 'SO 중지 피해'10

41

tr -s 명령을 사용하고 싶습니다.

 ps aux | tr -s [:blank:] | cut -d' ' -f3

이렇게하면 모든 공백이 1 칸으로 줄어 듭니다. 이 방법으로 컷을 구분자로 공백을 사용하도록 지시하면 예상대로 적용됩니다.


1
나는 이것이 대답이어야한다고 생각한다. 그것은 OP 요청에 더 가깝다 (cut을 사용해야 함). 이 접근 방식은 awk 접근 방식보다 5-10 % 느리지 만 (tr로 처리 할 파이프가 하나 더 있기 때문에) 일반적으로 이것은 관련이 없습니다.
Oliver

11

tr -s [:blank:]최선의 답변 으로 추천하겠습니다 .

왜 컷을 사용하고 싶습니까? "첫 번째 두 필드는 생략하고 세 번째 필드와 그 뒤의 모든 필드를 원합니다"라는 마법 명령이 있습니다.

cat log | tr -s [:blank:] |cut -d' ' -f 3- 

나는 얼마나 많은 필드가 있는지 알 수없는 awk 또는 perl split에 대한 동등한 명령이 있다고 생각하지 않습니다. 즉, 세 번째 필드를 필드 X를 통해 넣습니다.


9

더 짧거나 간단한 해결책 : 사용 cuts(내가 쓴 스테로이드를 자른다)

ps axu | grep '[j]boss' | cuts 4

하는 것으로 cuts5 번째 필드가 4로 지정되도록 필드 인덱스는 0을 기준으로

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

그리고 더 짧게 (절단을 전혀 사용하지 않음)는 다음과 같습니다.

pgrep jboss

8

이 문제를 해결하는 한 가지 방법은 다음과 같습니다.

$ps axu | grep jboss | sed 's/\s\+/ /g' | cut -d' ' -f3

여러 개의 연속 공백을 단일 공백으로 대체합니다.


이상하게도 OS X에서는 작동하지 않습니다. sed 명령은 여러 공간을 한 공간으로 변경하지 않습니다.
rjurney

2
\sGNU sed 확장입니다. OS X에서 당신은 전달할 수 있습니다 -E다음, 확장 된 정규 표현식을 수 있도록 사용 나오지에 플래그를 [[:space:]]대신 \s:과 같이,sed -E 's/[[:space:]]+/ /g'
자레드 잉

4

개인적으로, 나는 이런 직업에 awk를 사용하는 경향이 있습니다. 예를 들면 다음과 같습니다.

ps axu| grep jboss | grep -v grep | awk '{print $5}'

6
로 압축 할 수 있습니다 ps axu | awk '/[j]boss/ {print $5}'.
zwol

1
sed / grep / cut이 더 느리지 않습니까 (특히 불필요한 다른 프로세스가있을 때)?
pihentagy

2

대안으로 항상 perl이 있습니다.

ps aux | perl -lane 'print $F[3]'

또는 3 번 필드에서 시작하여 모든 필드를 가져 오려면 (위의 답변 중 하나에 명시된대로) :

ps aux | perl -lane 'print @F[3 .. scalar @F]'

이것은 lsof내가 시도한 결과와 함께 작동하지 않습니다. lsof|perl -lane 'print $F[5]'이것은 때때로 5 번째 열, 때로는 6 번째 열을 가져옵니다
rubo77

질문은 다양한 수의 공백을 포함 할 수있는 구분 기호를 사용하는 방법에 불과하다고 생각합니다. 이 목적에 대한 답은 정확했습니다.
flitz

lsof에서 문제는 열 수가 각 행에서 항상 일치하지는 않는다는 것입니다.
flitz


2

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

Pid 및 vsz는 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})"

0

cut 명령을 사용해야하는 경우 다른 방법

ps axu | grep [j]boss |awk '$1=$1'|cut -d' ' -f5

Solaris에서 awk를 nawk또는/usr/xpg4/bin/awk


0

나는 여전히 Perl이 공백으로 필드를 처리하는 방식을 좋아합니다.
첫 번째 필드는 $ F [0]입니다.

$ ps axu | grep dbus | perl -lane 'print $F[4]'

0

내 접근 방식은 PID를 / tmp의 파일에 저장하고에 대한 -S옵션을 사용하여 올바른 프로세스를 찾는 것입니다 ssh. 그것은 오용 일 수도 있지만 나를 위해 일합니다.

#!/bin/bash

TARGET_REDIS=${1:-redis.someserver.com}
PROXY="proxy.somewhere.com"

LOCAL_PORT=${2:-6379}

if [ "$1" == "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 $2}'`
echo $SSH_PID > /tmp/sshTunel${LOCAL_PORT}-pid

SSH_PID파일이 오래되어 잘못된 프로세스를 죽일 수 있으므로 파일을 죽이기 전에 권한 을 쿼리하는 것이 더 나은 방법 일 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.