$ i在awk语句中的for循环中不起作用

use*_*982 0 bash awk for-loop if-statement

PFB代码:

for i in 3 4 5 6 7;
do
echo "try $i";
cat vm.txt | cut -f6 -d" " | awk '{ if (NR==$i) print $0 }';
sleep 1;
done;
Run Code Online (Sandbox Code Playgroud)

文件vm.txt包含:

 kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s0 s1 s2 s3   in   sy   cs us sy id
 1 0 0 108257664 49651668 401 2616 445 0 0 0 1 3 -0 6 6 1436 13883 1427 1 47 52
 0 0 0 100580908 40823736 1533 4406 4075 1 1 0 0 0 0 0 0 3190 99090 2767 10 2 88
 1 0 0 100580720 40771708 917 5865 0 0 0 0 0 0 0  0  0 3747 137273 3557 13 2 85
 1 0 0 100580168 40721008 401 1725 0 0 0 0 0 0 0  0  0 3220 109486 2761 11 2 87
 1 0 0 100581152 40703900 199 2494 0 0 0 0 0 0 0  0  0 3727 91301 2932 9  2 89
 1 0 0 100581636 40710604 0 0 0 0  0  0  0  0  0  0  0 2472 59069 2136 8  1 91
 1 0 0 100581644 40730952 45 501 0 0 0 0 0  0  0  0  0 2939 87167 2540 9  1 90
 2 0 0 100581632 40712628 46 502 0 0 0 0 0  0  0  0  0 3251 88502 2763 9  1 90
 1 0 0 100581628 40757704 185 219 0 0 0 0 0 0  0  0  0 3058 81429 2590 9  1 90
 1 0 0 100581628 40747620 3602 52322 0 0 0 0 0 0 0 0 0 7353 127233 6077 10 5 85
Run Code Online (Sandbox Code Playgroud)

现在,当我运行此命令时:

cat vm.txt | cut -f6 -d" " | awk '{ if (NR==3) print $0 }';
Run Code Online (Sandbox Code Playgroud)

它可以工作,但它在for循环中不起作用.我不知道问题是什么.非常感谢帮助.

Ian*_*rts 8

参数awk是单引号,而shell变量不是用单引号插值的.您可以将引号更改为double(然后转义任何真正需要通过的美元符号awk):

for i in 3 4 5 6 7; do
  echo "try $i"
  cat vm.txt | cut -f6 -d" " | awk "{ if (NR==$i) print \$0 }"
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)

或者,坚持使用单引号可能会更健壮,但是将shell变量赋值给Awk变量(在这个特定示例中没有区别,但通常情况下,如果$i可能包含空格等等):

for i in 3 4 5 6 7; do
  echo "try $i"
  cat vm.txt | cut -f6 -d" " | awk -v ndx="$i" '{ if (NR==ndx) print $0 }'
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)