awk match命令中的变量问题

时间:2013-05-12 14:24:47

标签: bash awk

道歉,如果下面是凌乱或有更清洁的方式,我还在学习!

我正在使用CURL来抓取一个带有数字/ HTML的页面,以使用下面的命令使用数字到达表格

echo $curlo | awk '/<th>00/ { match($0, /<th>00/); print substr($0, RSTART - 10, RLENGTH + 40000); }' | sed 's/d1ffce/\'$'\n/g'| sed 's/88ff7f/\'$'\n/g' | grep -o '[0-9]*' 

要在th00处开始输出,请打印下一个40000个字符(页面大小不一样但不会那么高),替换一些十六进制颜色代码,然后打印出所有数字

然而,th00会随着时间的推移变为th01,02等,所以我正在尝试使用变量。为了测试,我设置cnt = 00并在命令中用变量

替换它
echo $curlo | awk '"/<th>$cnt/" { match($0, "/<th>$cnt/"); print substr($0, RSTART - 10, RLENGTH + 40000); }' | sed 's/d1ffce/\'$'\n/g'| sed 's/88ff7f/\'$'\n/g' | grep -o '[0-9]*'

但输出完全不同。如果我回复$ cnt它打印00罚款。我也尝试将整个th00放在cnt变量和同样的问题中。

为了比较当我使用第一个命令时,我得到382行,当我使用第二个命令时,我得到896

这是使用bash shell btw

1 个答案:

答案 0 :(得分:0)

Shell变量不会在单引号内展开。但最好使用-v选项分配awk变量:

echo "$curlo" | awk -v cnt=$cnt 'match($0, "<th>" cnt "") { 
                    str = substr($0, RSTART-10, RLENGTH+40000);
                    gsub("d1ffce|88ff7f", "$\n", str);
                    gsub(/^[^0-9]+|[^0-9]+$/, "", str);
                    gsub(/[^0-9]+/, "\n", str);
                    print str; }'

也无需输入sedgrep -o,因为awk可以使用gsub()执行相同操作。