1

抱歉,如果以下内容混乱或有更清洁的方法可以做到这一点,我仍在学习!

我正在使用 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 顺便说一句

4

1 回答 1

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; }'

也不需要管道到sedand grep -o,因为awk可以用gsub().

于 2013-05-12T14:44:12.160 回答