내용이 오른쪽 정렬되고 일부 열이 항상 채워지지 않는 특정 출력 열을 가져옵니다.

내용이 오른쪽 정렬되고 일부 열이 항상 채워지지 않는 특정 출력 열을 가져옵니다.

이것은 제가 자주 직면하는 문제입니다. 이번에는 출력에서 ​​발생 lsof하지만 저는 이러한 유형의 문제에 대한 일반적인 해결책을 찾고 있습니다: 열 선택.

여기서는 출력의 TYPE 열을 얻으려고 합니다.lsof

COMMAND     PID   TID                USER   FD      TYPE             DEVICE     SIZE/OFF       NODE NAME
lsof      16113                      root  cwd       DIR               0,58        40960    7602184 /home/rubo77
lsof      16113                      root  rtd       DIR              259,7         4096          2 /
lsof      16113                      root    4r     FIFO               0,12          0t0     294763 pipe
lsof      16113                      root    7w     FIFO               0,12          0t0     294764 pipe
lsof      16648                      root  rtd       DIR              259,7         4096          2 /
riot-web   4399  4424               ruben   25u     unix 0xffff9543f9ad7000          0t0      53133 type=STREAM
thunderbi  4650  5835               ruben  DEL       REG              259,7                 2752546 /usr/share/icons/hicolor/icon-theme.cache
...

나는 노력했다

lsof|perl -lane 'print $F[5]'

하지만 이것은 때로는 열 6을 가져오고 때로는 열 5를 가져옵니다.

알겠어요

lsof|cut -c50-54|sort|uniq -c

375  CHR 
610  DIR 
211 FIFO 
...

하지만 캐릭터 위치를 수정해야 하기 때문에 조금 지저분해 보입니다.

주요 문제는 일부 행에서 다섯 번째 열이 비어 있다는 것입니다.

실제로 출력의 6번째 열만 선택하는 솔루션이 있습니까?

가장 좋은 솔루션은 show row Pillar라고 말하는 도구입니다.

답변1

-F옵션을 사용하면 구문 분석에 더 적합한 출력을 얻을 수 있습니다.

lsof -F t | awk '/^t/ {print substr($0,2)}'

다음 OUTPUT FOR OTHER PROGRAMS섹션을 참조하세요.man lsof


더 일반적으로는 필드가 명확하게 구분되지 않는 한 헤더 행에서 문자 위치를 검색해야 할 수도 있습니다.

awk -v field="TYPE" 'NR==1 {c = index($0,field)} {print substr($0,c,length(field))}'

답변2

이것을 사용하면 awk다음을 수행할 수 있습니다.

lsof | awk '{print $5}'

그러면 숫자 5 열이 인쇄됩니다.

답변3

행의 열 수에 따라 원하는 열을 선택합니다.

lsof | perl -ane 'printf "%s\n",(@F>9) ? $F[5] : $F[4]'

Perl은 0부터 시작하여 요소에 번호를 매깁니다. 이 -a스위치는 입력 문자열(라인)을 자동으로 F0 인덱스 필드로 분할합니다.

관련 정보