我试图在文件的每一行上运行一个命令。下面是我目前所做的。我希望能够获取每一行,从中获取最后一列,对整数运行一个命令,如果它不等于零,则回显整行。我似乎遇到了错误,但似乎无法弄清楚在哪里。
#!/bin/bash
IFS=\n
file=`cat /proc/user_beancounters`
for line in "$file"
do
last_col=`echo "$line" | awk '{print $(NF)}'`
if [ $last_col -ne 0 ]; then
echo $last_col
fi
done
/proc/user_beancounters 的内容:
Version: 2.5
uid resource held maxheld barrier limit failcnt
34579: kmemsize 28694400 33435648 67108864 67108864 0
lockedpages 0 0 64 64 0
privvmpages 473539 581717 786432 786432 176
shmpages 26821 26821 43008 43008 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 113 159 500 500 0
physpages 199504 208572 524288 524288 0
vmguarpages 0 0 98304 98304 0
oomguarpages 188782 191010 6144 6144 0
numtcpsock 35 37 160 160 0
numflock 8 11 100 100 0
numpty 1 1 200 200 0
numsiginfo 0 36 500 500 0
tcpsndbuf 616080 650960 8388608 8388608 0
tcprcvbuf 577800 621600 8388608 8388608 0
othersockbuf 108664 135616 8388608 8388608 0
dgramrcvbuf 0 16184 8388608 8388608 0
numothersock 116 128 500 500 0
dcachesize 8375457 8388258 8388608 8388608 0
numfile 2627 2915 8192 8192 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numiptent 168 168 9999999 9999999 0
在上面的例子中,我希望脚本基本上找出“privvmpages”失败了不止一次的情况,因此回显该行:
privvmpages 473539 581717 786432 786432 176
或者如果可能的话,只需名称“privvmpages”和数字“176”
提前致谢
答案1
使用bash
以下工作:
while IFS= read -r line
do
last_col=`echo "$line" | awk '{print $(NF)}'`
if [[ $last_col =~ ^[[:digit:]]+$ && "$last_col" -ne 0 ]]; then
echo $line
fi
done </proc/user_beancounters
笔记:
该命令
IFS=\n
设置IFS
为字母n
。这不是您想要的。如果您确实想要IFS
换行符,请改用IFS=$'\n'
。$last_col =~ ^[[:digit:]]+$
此测试确保为
last_col
整数。这具有跳过标题行的效果。
使用awk
循环遍历文件的行是awk
很自然的事情。上面的代码可以替换为:
awk 'NR > 2 && $NF != 0' /proc/user_beancounters
笔记:
NR>2
文件的前两行是标题。这将跳过它们。
$NF != 0
这将选择最后一个字段非零的行。
如果以上两个条件没有明确的命令,
awk
则将打印整行。
或者,如果您只想打印第一列和最后一列,请使用:
awk 'NR>2 && $NF != 0 {print $1,$NF}' /proc/user_beancounters