文档章节

shell脚本处女作之命令行词典

laichendong
 laichendong
发布于 2014/06/25 09:27
字数 1018
阅读 60
收藏 1
点赞 1
评论 1
ubuntu下没有一个用着趁手的客户端版词典,查词又作为刚需摆在那里。搜了一下,有人用python和shell写过一些脚本调用web把查词结果显示到命令行,成为“命令行词典”。很有geek范儿。我喜欢“柯林斯词典”的英-英释义,还有例句。现成的那些脚本都没有采纳这个词典。就自己动手,丰衣足食了。作为一个基本上的shell盲来说,这么一个小程序,也很长姿势。 原理很简单。 抓取有道词典相应词语页面的内容。用awk,sed处理截取想要的内容,最后在用自己想要的形式输出出来

一、抓取页面

我使用cur抓取了有道词典的 单词页面
curl -s 'http://dict.youdao.com/search?q='$1''
(-s 参数表示“silence”,安静模式,不会输入多余的信息) 分析页面的源代码发现,如果所查的词有柯林斯词典的解释,将会出现在下面: 20130826195620

二、从源码中截取有用的信息

awk 'BEGIN{j=0;} {if(/collinsToggle/){ j++;} if(j==1) {print $0; if(/<\/ul>/) j=0;}}' | sed 's/<[^>]*>//g' | sed 's/&nbsp;//g'| sed 's/&rarr;//g' | sed 's/^\s*//g' | sed '/^$/d'
这里分了几步来做,首先使用awk找出柯林斯词典的内容,然后用sed移除掉html代码中的标签,空白,空行等等,剩下的就是我们要的“干货“了。关于awk和sed的内容,照着耗子的 AWK简明教程sed简明教程做了几遍,加上一些google就搞定了。感觉awk简直是map-reduce思想的开山鼻祖啊。

三、输出

其实直接就将上面命令的内容输出,功能就已经ok了。勉强也能看。但作为geek又岂能让自己的”第一次“如此丑陋?于是我将命令的输出重定向到一个文件里,然后用read将文件按行读入稍作加工。关于将文件按行读入,也遇到一个小坑。开始我是用的是这个方法读取的文件:
head=''
cat /etc/passwd | while read LINE  
do
        head="$head $LINE"
        echo $LINE 
done
然后发现在循环结束后head并没有改变,然后google到了这篇 帖子,又涨了点姿势。于是我将读取文件的代码稍作了一下修改:
while read line
do
	# do something
done < $TEM_FILE
最后为了美观。想对输出的内容做一点颜色上的调整,突出一下重点。于是又google。发现命令行可用用ANSI颜色来控制文本的样式(用SecureCRT的时候也可以找到这个选项,勾上就有颜色了)。关于ANSI颜色,又 google了一些文章看看就明白了:) 把完整代码贴一下:
#!/bin/bash
ARGS=1
E_BADARGS=65
TEM_FILE="/tmp/dict.tmp"

if [ $# -ne "$ARGS" ]
 then
	echo "Usage:`basename $0` word"
	exit $E_BADARGS
fi

# 抓取页面,删除html代码,空行等,只留下想要的内容
curl -s 'http://dict.youdao.com/search?q='$1'' | awk 'BEGIN{j=0;i=0;} {if(/phrsListTab/){i++;} if(i==1){print $0; if(/<\/ul>/){i=0;}} if(/collinsToggle/){ j++;} if(j==1) {print $0; if(/<\/ul>/){j=0;}}}' | sed 's/<[^>]*>//g' | sed 's/&nbsp;//g'| sed 's/&rarr;//g' | sed 's/^\s*//g' | sed '/^$/d'> $TEM_FILE

# 处理输出
is_head=true # 当前行是否属于“头部”
head="" # 头部内容
body="" # 主体内容
ln_item=0 # 每一条解释的行号
ln_eg=0 # 例句行号

while read line
do
	let ln_item++
	let ln_eg++
	num_flag=`echo "$line" | awk '/[0-9]+\.$/'`
	if [ "$num_flag" != "" ]; then ## 遇见'数字+点'开头的行
		is_head=false # 第一次遇见数字行  将头部标示设置为false
		ln_item=0
	fi

	eg_flag=`echo "$line" | awk '/例:$/'` # 遇见'例:'开头的行
	if [ "$eg_flag" != "" ]; then
		ln_eg=0
	fi

	if $is_head ; then
		head="$head $line"
	else
		if [ $ln_item == 0 ] ; then
			line="\033[32;1m\n\n$line\033[0m" # 释义编号
		elif [ $ln_item == 1 ] ; then
			line="\033[32;1m[$line]\033[0m" # 词性
		elif [ $ln_item == 2 ] ; then
			line="\033[1m$line\033[0m" # 释义 
		elif [ $ln_eg == 0 ] ; then
			line="\033[32;1m\n   $line\033[0m" # 例:
		elif [ $ln_eg == 1 ]; then
			line="\033[33m$line\033[0m" # 例句 
		elif [ $ln_eg == 2 ]; then
			line="\033[33m$line\033[0m" # 例句释义 
		fi
		body="$body $line"
	fi
done < $TEM_FILE
echo -e "\033[31;1m$head\033[0m $body"

exit 0
   

© 著作权归作者所有

共有 人打赏支持
laichendong
粉丝 8
博文 85
码字总数 71483
作品 0
朝阳
程序员
加载中

评论(1)

hehe668
hehe668
刚开始看到这个源代码,就很喜欢,想知道怎样从页面源代码中如何抓取想要的信息的,反复看了几天,渐渐对整体的框架有了了解.今天又偶遇作者的原创思路,从最初的遇到的问题(ubuntu下没有一个用着趁手的客户端版词典)到提出自己的想法,并根据自己的需求,参考相关的资料,就开始行动了,途中又不断的优化自己的代码.真得干的漂亮.为你点赞.同时感谢你的开源精神!愿大神带菜鸟一起飞!13121213
google translate between chinese and english

每次碰到不认识到单词都要请教“有道词典”,可是又不想让它常驻内存。所以考虑在cygwin下使用wordnet,但是到了cygwin17下的安装wordnet又需要安装大堆的X11,不符合我简洁的风格,所以写了...

wonder365 ⋅ 2013/02/19 ⋅ 2

Shell脚本编程学习入门:Shell编程基础

Shell脚本编程学习入门是本文要介绍的内容,我们可以使用任意一种文字编辑器,比如gedit、kedit、emacs、vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bin/sh......

技术小阿哥 ⋅ 2017/11/12 ⋅ 0

Linux shell 编程

shell 编程概念 (1) shell是一种命令行解释器,外壳有很多种类 (2) shell 看成是Linux内核和用户沟通的桥梁,用户默认不能直接操作内核 (3)可以通过shell外壳去操作,用户指令传递给shell,传...

zdq1992 ⋅ 2017/11/15 ⋅ 0

shell 函数

function 函数 1.什么是函数 函数也是具有和别名类似的功能: 简单地说,函数的作用就是把程序里多次调用相同的代码部分定义成一份,然后为这一份代码起个名字,其他所有的重复调用这部分代码...

jy1779 ⋅ 2016/08/26 ⋅ 0

面试linux运维一定会问到Shell脚本这24个问题

虽然现在Python在运维工作中已经使用很普遍,但是很多企业在找Linux云计算工程师的时候还是会问到 shell 脚本的问题,它有助于你在工作环境中自动完成很多任务。 如下是一些面试过程中,经常...

tom_tuwei ⋅ 2017/12/23 ⋅ 0

Shell脚本调试方法 Shell脚本执行的过程

Shell脚本调试方法 Shell脚本执行的过程 分类:-[小西南]- (8434) (0) 1Shell脚本调试方法 Shell提供了一些用于调试脚本的选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法...

Mr_Tea ⋅ 2016/09/09 ⋅ 0

调整音频模型以实现更好的语音识别

处理一个准备不充足的音频模型可能会令人感到沮丧,特别是对于语音识别领域的初学者,他们习惯使用自己的口音相关模型。不像键盘和鼠标输入那样行动相对比 较积极且易于操作系统解释,将音频...

IBMdW ⋅ 2012/07/24 ⋅ 1

Shell学习笔记2

一、shell特殊变量 1.位置变量 2.进程状态变量 二、举例说明 1.位置变量 $0 获取当前执行的shell脚本的文件名,包括脚本路径 [root@localhost ~]# cat 0.shecho $0[root@localhost ~]# sh 0....

小南学技术 ⋅ 2016/08/16 ⋅ 0

shell中的eval学习与应用

一、bash命令处理的12个步骤; 1、将命令行分成由固定元字符集分隔的记号; 记号类型包括单词,关键字,I/O重定向符和分号。 2、检测每个命令的第一个记号,查看是否为不带引号或反斜线的关键...

Zero零_度 ⋅ 2015/04/08 ⋅ 0

使用 Impala Shell(翻译)

使用 Impala Shell 你可以使用 Impala shell 工具 (impala-shell) 配置数据库和表、插入数据和执行查询。你可以在交互式会话里提交 SQL 语句进行即席查询和探测(For ad hoc queries and exp...

weiqingbin ⋅ 2014/01/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 今天 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部