我有下一个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... 循环
- 最后的我们喂养整个循环使用 < 重定向器与文本文件。
玩得开心!