【问题标题】:trouble with variable in awk match commandawk match 命令中的变量问题
【发布时间】:2013-05-06 16:17:09
【问题描述】:

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

我正在使用 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

【问题讨论】:

  • 为什么需要RLENGTH+40000?如果您只想打印字符串的其余部分,请忽略该参数,它默认打印到结尾。

标签: bash awk


【解决方案1】:

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() 做同样的事情。

【讨论】:

  • 谢谢!我最终以另一种方式完成了这项工作,但为了学会正确地完成这项工作,我回家后会尝试一下。
猜你喜欢
  • 2013-01-13
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
相关资源
最近更新 更多