Bash脚本优化

Mar*_*rko 1 bash optimization

这是有问题的脚本:

for file in `ls products`
do
  echo -n `cat products/$file \
  | grep '<td>.*</td>' | grep -v 'img' | grep -v 'href' | grep -v 'input' \
  | head -1  | sed -e 's/^ *<td>//g' -e 's/<.*//g'`
done
Run Code Online (Sandbox Code Playgroud)

我将在50000+文件上运行它,这个脚本大约需要12个小时.

算法如下:

  1. 仅查找包含<td>不包含任何"img","href"或"input"的表格单元格()的行.
  2. 选择第一个,然后在标签之间提取数据.

可以使用通常的bash文本过滤器(sed,grep,awk等)以及perl.

gle*_*man 5

看起来这一切都可以用一个gawk命令替换:

gawk '
    /<td>.*<\/td>/ && !(/img/ || /href/ || /input/) {
        sub(/^ *<td>/,""); sub(/<.*/,"")
        print
        nextfile
    }
' products/*
Run Code Online (Sandbox Code Playgroud)

这使用gawk扩展nextfile.

如果通配符扩展太大,那么

find products -type f -print | xargs gawk '...'
Run Code Online (Sandbox Code Playgroud)