이것은 제가 자주 직면하는 문제입니다. 이번에는 출력에서 발생 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
스위치는 입력 문자열(라인)을 자동으로 F
0 인덱스 필드로 분할합니다.