将列中的所有值与字符串进行比较

将列中的所有值与字符串进行比较

我有下一个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

你可以说我很守旧,当然不注重表现,但出于某种原因,我总是回到过去bash 循环在这样的情况下,我更感觉“掌控之中”这边走。[ndlr:这只是 bash]

> $ 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

按回车键...瞧!

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 字符串操作:“//”选择“\”表示空格,“/”表示空格替换字符串(在我们的例子中:什么都没有):${_mycpu//\ /}然后我们用以下方法测试它的数字:案例[0-9]) ... ;;语句* - 这避免了对空白行、标题和行分隔符的处理测试 - 可以轻松添加其他条件。
  • case *|"") : ;; 语句是为了清楚起见:在所有其他情况下,只需继续执行其余代码。
  • 在第一种情况下,我们然后针对值“0kB”测试 _myswap,条件是使用由 if 语句开头的 ! 否定的“近似”比较“=~”: [[ ! ... =~ ]] ; 我们通过添加 ^ [[ ... =~ ^"0kB" ]] 来测试变量是否以“0kB”开头,因此如果 _myswap 不以“0kB”开头,则我们回显行号 _x 和值。其他每个变量的
  • 我们用 did 语句关闭 while ... read... do... 循环
  • 最后的我们喂养整个循环使用 < 重定向器与文本文件。

玩得开心!

相关内容