awk 分隔符 转义
作者:shen 发布时间:May 29, 2011 分类:Linux,Shell
awk 可以指定分隔符,在指定的分割符里面如果包含元字符,就需要转义。在awk中和一般的正则表达式中转义规则略有不同。比如
如果要指定 | 分隔符
awk -F'\|'
上面那种方法是不行的。必须这样:
awk -F'\\|'
就是说awk分割符遇到元字符转义,需要两个反斜杠
作者:shen 发布时间:May 29, 2011 分类:Linux,Shell
awk 可以指定分隔符,在指定的分割符里面如果包含元字符,就需要转义。在awk中和一般的正则表达式中转义规则略有不同。比如
如果要指定 | 分隔符
awk -F'\|'
上面那种方法是不行的。必须这样:
awk -F'\\|'
就是说awk分割符遇到元字符转义,需要两个反斜杠
作者:shen 发布时间:May 29, 2011 分类:Linux,Shell
方法是用curl获取搜索页面,然后再提取其中的有用信息:
使用时传入一个参数:要搜索的关键词
由于百度默认输出为gb2312编码,最后将编码转为utf-8
#!/bin/bash
search_result=`curl -A Mozilla "http://www.baidu.com/s?ie=utf-8&wd=$1"`
#相关搜索
rel=`echo "$search_result" | sed -n '/<div id="rs">/{:a;n;/<div id="search">/q;p;ba}'|\
sed 's/<[^>]*>//g'|sed '/^[[:space:]]*$/d'|tr "\n" ","|iconv -f gbk -t utf-8`
#搜到的条目数量
num=`echo "$search_result" |grep '<p id="page">'|awk -F'[<>]' '{for(i=1;i<=NF;i++) print $i}' |\
sed -n '/span class="nums"/{n;p;}' |grep -o '[0-9]' |awk '{printf("%d",$0)}'`
#搜索提示
tip=`echo "$search_result" |\
sed -n '/<p style="margin:0 15px 10px"><strong class=f14>.*<span class="jc">/{:a;n;/<\/span><\/strong><br><\/p>/q;p;ba}'|\
sed '/^[[:space:]]*$/d;s/<[^>]*>//g;s/ //g'|\
tr "\n" ","|iconv -f gbk -t utf-8`
echo "$1"
echo "=========="
echo "搜索提示 $tip"
echo "共搜到 $num 条结果"
echo "相关搜素 $rel"
echo "======="
#前几条搜索结果,id="1" 到<p id="page">
echo "$search_result" |sed -n '/id="1"/,/<p id="page">/p'|tr -d "\r"|tr -d "\n"|sed 's/<table [^>]*>/\
/g'|sed '/baike\.baidu\.com/d'|sed '/dict\.baidu\.com/d'|\
sed '/^[[:space:]]*$/d'|egrep '<h3'|\
sed 's/.*<h3 class="t">\(.*\)<\/h3>.*<span class="g">/\1\t---\t/'|awk -F'<\/span>' '{print $1}'|\
sed 's/<[^>]*>//g'|iconv -f gbk -t utf-8
echo "=========="
echo ""
作者:shen 发布时间:May 27, 2011 分类:Shell
比如有一段html代码如下:
<h3 class=a>ABCD</h3>abc<span>1234<span class=b>EF</span>5678</span>
想要提取ABCDEF ,可以使用sed的模式替换,即将向提取的内容保存到模式中
首先需要提取h3标签之间的内容,然后提取内层的span之间的内容。
代码如下:
echo "<h3 class=a>ABCD</h3>fdffd<span>1234<span class=b>EF</span>5678</span>"|\
sed 's/.*<h3 class=a>\(.*\)<\/h3>.*<span class=b>\([^\(<\/span>\)]*\)<\/span>.*/\1\2/'
#由于有两层span ,所以在<span class=b>和<\/span>之间不能有<\/span>,所以使用[^\(<\/span>>\)]*
对于嵌套的() ,模式顺序是先外层,后内层,例如:
echo "0123abc456defg" |sed 's/[0-9]*\([a-z]\{2\}\(.*\)[0-9]\)[a-z]*/\2 - \1/g'
sed的模式中圆括号和花括号都要加反斜杠 \ 转义。
显示c45 - abc456
外层括号匹配数字之后,字母之前,中间含有字母和数字的子字符串,在替换串中用 \1 表示,结果为abc456
内层括号匹配外层串abc456中两个字母之后,一个数字之前的子串,在替换串中用 \2 表示,结果为c45
这种方法错误,[^\(<\/span>\)]不能匹配非<\/span>
作者:shen 发布时间:May 26, 2011 分类:Linux,Shell
换行有三种 Windows格式(\n\r),unix格式(\n),mac格式(\r)
移除换行时,可能并不知道是哪种格式,只需要这样即可:
cat file|tr -d "\r"|tr -d "\n"
另外tr也可用来将一种格式换行转为另一种格式,比如Windows格式转为unix格式:
cat file|tr "\n\r" "\n"|sed -d "\r"
unix格式转为Windows格式:
cat file|sed -d "\r"|tr "\n" "\n\r"
unix 转为mac格式:
cat file|sed -d "\r"|tr "\n" "\r"
作者:shen 发布时间:May 26, 2011 分类:默认分类
上次说到域名批量查询,是用来查询cn域名的,不能用于com及net,应为域名whois返回信息不同,但是原理基本相同,只需要做一些修改即可。要改的主要就是查询函数,改成这样:
function availability_check(){
whois_info=`whois "$1"`
if (echo "$whois_info"| grep "Creation Date" > /dev/null) then
creation1=`echo "$whois_info" |grep "Creation Date"|awk -F":" '{print $2;exit}'`
creation=`date "+%Y%m%d" -d "$creation1"`
expiration1=`echo "$whois_info" |grep "Expiration Date"|awk -F":" '{print $2;exit}'`
expiration=`date "+%Y%m%d" -d "$expiration1"`
Registrar=`echo "$whois_info" |grep "Registrar"|awk -F":" '{print $2;exit}'`
echo "$creation $expiration$Registrar"
return 0
elif(echo "$whois_info"| grep "No match for" > /dev/null) then
echo "available"
return 1
else
com_check "$1"
fi
}
函数传递一个com或者net域名进去即可,返回域名注册日期、到期日期、注册商,若该域名未注册则返回available
一个调用上面函数的例子:
dn="baidu.net"
res=`availability_check "$dn"`
echo "$dn $res"
运行结果:

批量查询可参考域名批量查询