bash 명령에서 하위 문자열을 얻는 방법


8

명령에서 얻은 다음과 같은 하위 문자열이 제공됩니다 df /dev/sdb1 | tail -n 1.

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

bash 스크립트에서 사용하기 위해 해당 문자열에서 추출 1952971772하고 싶습니다 74%.

컷 명령이나 무언가를 사용할 수는 있지만 크기가 바뀌면 더 이상 작동하지 않습니다.

나는 또한 정규 표현식이나 다른 것을 사용하는 것에 대해 생각했지만 가장 권장되는 접근법을 원합니다.

미리 감사드립니다!


2
일반적인 경우 또는 df특히 궁금한 점이 있습니까? 후자의 경우 특정 출력 필드를 명시 적으로 지정할 수 있습니다 (예df --output=pcent /dev/sdb1
steeldriver

2
cut줄에서 문자 위치를 사용 하고 있으므로 파일 크기의 변동으로 줄 길이가 변경되면 실패합니다. 나는 당신이 말할 수 있다고 생각 cut열을 선택 2하고 열 5공백으로 묘사를하지만 전화에있어 연구하고 효율적으로 답변을 게시 할 수 없습니다.
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix 공백의 수는 다를 수 있으므로 어떤 열 번호가 올바른지 말하기 어렵습니다. cut각 구분 기호 다음에 하나의 열이 표시됩니다.
mook765

두 개 이상의 연속 공간은 여전히 ​​열을 묘사하기위한 단일 공간으로 간주됩니다.
WinEunuuchs2Unix

@ WinEunuuchs2Unix correct :) 내가 가지고있는 텍스트 파일의 명령 : D
Rinzwind

답변:


6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

백분율과

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

크기.

없이 tail:

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    여러 구분 기호가 1로 계산되는 두 번째 열을 가져옵니다. 따라서 두 번째 열은 시스템의 명령의 첫 번째 부분과 동일합니다.

  • NR 처리중인 총 레코드 수 또는 행 번호를 제공합니다.


1
또는 한 줄에 둘 다 필요한 경우 df /home | awk '{print $2; print $5;}'.
Videonauth

3
Awk는 그냥 사용하는 END대신 블록 의 마지막 줄을 유지합니다tailawk 'END { print $2,$5}'
Kevin

참고로 나는 이름을 메타로 떨어 뜨렸다 :) meta.askubuntu.com/questions/18584/…
WinEunuuchs2Unix

8

수정 된 답변

@ kevin이 언급했듯이 awk마지막 줄만 선택 하고을 사용하여 꼬리를 전혀 사용 END하지 않고 한 번에 두 열을 인쇄하려는 경우 다음을 수행 할 수 있습니다.

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

원래 답변

두 번째 열만 선택할 수 있습니다.

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

여기서 $2TAB로 구분 된 열의 위치를 ​​나타냅니다. cutTAB의 발생을 한 번만 처리하므로 열을 구분하기위한 여러 개의 TAB 이 있으므로 사용할 수 있습니다 .


3
Awk는 그냥 사용하는 END대신 블록 의 마지막 줄을 유지합니다tailawk 'END { print $2,$5}'
Kevin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.