열의 모든 값을 문자열과 비교

열의 모든 값을 문자열과 비교

다음 txt 파일이 있습니다.

      -----------------------------
       CPU(%)    SWAP     Memory(%)
      -----------------------------
      181.2     0kB       0.4
      12.5     0kB       0.4
      0.0     0kB       0.4
      0.0     0kB       0.4
      0.0     0kB       0.4
      0.0     0kB       0.4
      0.0     0kB       0.4
      0.0     0kB       0.4

SWAP 열의 모든 값이 0kB인지 확인하고 싶습니다. 누군가 도와주셨으면 좋겠습니다 :)

답변1

를 사용하면 쉽게 이 작업을 수행할 수 있습니다 awk. 첫 번째 필드가 숫자로만 구성되거나 .(헤더 행을 건너뛸 수 있도록) 두 번째 필드가 아닌 행을 인쇄하면 됩니다 0kB.

awk '$1~/^[0-9.]*$/ && $2!="0kB"' file

답변2

sed -r "s/^\s+/ /g" filename| awk 'BEGIN{print "-----------------------------------------------------\n  CPU(%)    SWAP     Memory(%)\n -------------------------------------------- "} {gsub("kB","",$0)}{if($2 == "0"){print $0}}'

산출

-----------------------------------------------------
  CPU(%)    SWAP     Memory(%)
 -------------------------------------------- 
 181.2     0       0.4
 12.5     0       0.4
 0.0     0       0.4
 0.0     0       0.4
 0.0     0       0.4
 0.0     0       0.4
 0.0     0       0.4
 0.0     0       0.4

답변3

저를 구식이라고 할 수도 있고 확실히 성과 지향적이지 않은데 왠지 자꾸 과거로 돌아가는 것 같아요배쉬 루프이럴 때 더 기분이 좋아진다"통제 중"이 방법.[ndlr: 그냥 강타야]

> $ cat mytxt.txt

     -----------------------------
      CPU(%)    SWAP     Memory(%)
     -----------------------------
     181.2      0kB       0.4
      12.5      1kB       0.4
       0.0     10kB       0.4
       0.0      0kB       0.4
       0.0      0kB       0.4
       0.0      0kB       0.4
       0.0      0kB       0.4
       0.0      0kB       0.4

터미널에서 위 텍스트 파일의 폴더로 이동하여 아래 줄을 붙여넣습니다(변경"mytxt.txt"파일 이름과 일치하도록)

_x=0 ; while IFS=" " read -r _mycpu _myswap _mymem; do ((_x++)) ; case "${_mycpu//\ /}" in [0-9]*) if [[ ! "${_myswap//\ /}" =~ ^"0kB" ]]; then echo -e "line $_x) \t${_mycpu} \t${_myswap} \t${_mymem}"; else : ; fi ;; *|"")   : ;; esac ; done < mytxt.txt

Enter를 누르세요... 짜잔!

line 5)     12.5    1kB     0.4
line 6)     0.0     10kB    0.4

설명과 함께 보다 친숙한 형식의 동일한 oneliner 코드:

_x=0 ; \
while IFS=" " read -r _mycpu _myswap _mymem; do \
  ((_x++)) ; \
  case "${_mycpu//\ /}" in \
     [0-9]*) if [[ ! "${_myswap//\ /}" =~ ^"0kB" ]]; then \
               echo -e "line $_x) \t${_mycpu} \t${_myswap} \t${_mymem}"; \
              else : ; fi ;; \
     *|"")   : ;; \
  esac ; \
done < mytxt.txt

설명하다

  • _x= 각 라인을 읽을 때마다 라인 카운터를 1씩 늘립니다. (_x++)
  • IFS=" " : 파일에서 각 줄을 읽을 때 구분 기호를 "공백"으로 설정합니다. 이렇게 하면 공백으로 구분된 각 텍스트 블록이 3개 변수(_mycpu, _myswap 및 _mymem)에 지정될 수 있습니다.
  • 그런 다음 각 행의 첫 번째 변수를 테스트합니다._mycpu숫자로 시작하여 먼저 "제거" bash 문자열 작업을 사용하여 변수에서 불쾌한 공백을 모두 제거합니다. "//" 공백의 경우 "\"를 선택하고 공백 대체 문자열의 경우 "/"를 선택합니다( In 우리의 경우: 없음):${_mycpu//\ /}그런 다음 다음을 사용하여 수치적으로 테스트합니다.사례[0-9]) ... ;;statement* - 빈 줄, 헤더 및 줄 구분 기호 처리에 대한 테스트를 방지하여 다른 조건을 쉽게 추가할 수 있습니다.
  • case *|"") : ;; 명확성을 위한 설명입니다. 다른 모든 경우에는 나머지 코드를 계속 실행하면 됩니다.
  • 첫 번째 경우에는 if 문으로 시작하는 !의 부정된 "대략" 비교를 사용하여 "0kB" 값에 대해 _myswap을 테스트합니다. ^ [[ ... =~ ^"0kB" ]] 를 추가하여 변수가 "0kB"로 시작하는 경우 _myswap이 "0kB"로 시작하지 않으면 줄 번호 _x와 값을 에코합니다. 다른 모든 변수에 대해
  • while...read...do... 루프를 닫으려면 did 문을 사용합니다.
  • 마지막우리는 전체주기에 먹이를줍니다텍스트 파일에는 < 리디렉터를 사용하세요.

재미있게 보내세요!

관련 정보