页面

2011/03/17

CMMusic: 小巧而实用的 MPlayer 音乐播放前端

文章來自:http://linuxtoy.org/archives/cmmusic.html

CMMusic 是一个不错的 MPlayer 音乐播放前端,感兴趣的朋友不妨试试。
Author: Jiqing (jiqingwu@gmail.com)
home:http://hi.baidu.com/jiqing0925
create:2011-03-10
update:2011-03-10

为啥用cmmusic

mplayer是元老级的媒体播放器,到现在依然强大,因为它的“全能”, 一直拥有大量的用户。 但我们主要用mplayer看电影,其实用mplayer播放音乐也很不错: 占用资源很少,而且支持的格式非常多。
如果用xmms2或者mpd听音乐,如果想听wma什么的还要装额外的解码器。 而只要装了mplayer,看电影和听音乐只用它就够了。 无奈,mplayer没有个好用的前端。 不过,现在,小巧的cmmusic来了,为mplayer提供了一个简单实用的 音乐播放前端。
作者是咱中国人,可以从 这个网页 看到更多的信息。 大家有什么问题或建议可以用中文给他写信啊,方便交流。 感谢作者,向作者致敬。
cmmusic是用ncurse库的终端下运行的程序。 虽然界面不华丽,但功能全面,很实用,先看个截图吧。

安装cmmusic

现在,cmmusic似乎还没加到各发行版的仓库中。 可以从 https://sourceforge.net/projects/cmmusic/ 下载源码编译安装。
因为依赖ncurses,所以编译前请安装ncurses的开发库。 最好装libncursesw,支持宽字符,这样能支持中文显示。:
sudo apt-get install libncursesw5-dev
应该差不多了,如果提示缺什么库,就安装libxxx-dev吧。 然后使出程咬金的三板斧::
./configure
make
sudo make install
安装的文件如下:
  • cmmusic 核心程序,位于 /usr/local/bin
  • cmmusicx 其实是一个脚本,自动打开一个终端运行cmmusic, 位于 /usr/local/bin
  • cmmusic.xpm 用于在菜单中显示的图标,位于 /usr/local/share/pixmaps
  • cmmusic.desktop 程序菜单中显示的项目,位于 /usr/local/share/applications/

使用

  • l 载入或存储播放列表lst文件,也用于指定添加音乐文件的目录
  • + 添加音乐文件,会给出刚才用 l 指定的目录下的文件列表, 空格选中,按回车添加到播放列表
  • - 移除播放列表中的项目。
  • ] 增加音量
  • [ 减小音量
  • , 上一首
  • . 下一首
  • p 播放/暂停
  • s 停止
  • m 静音
  • q 退出
  • d 切换播放模式。
    • SING 表示只播放一遍当前选中的文件
    • SILP 重复播放当前选中的文件
    • MULT 顺序播放一遍当前列表中的文件
    • MULP 重复按顺序播放列表中的文件
    • RAND 乱序播放列表中的文件
  • r 设置歌词(只支持lrc文件)搜索目录。 默认lrc为GBK,如果为UTF8,请使用选项``-lrc UTF-8``
另外,cmmusic同样可以用于播放电影,有播放列表,看电视剧很方便。 最后,再次为国人的精彩作品喝彩!

2011/02/13

学习 GIMP

原文:http://linuxtoy.org/archives/free-gimp-tutorial-pdfs.html

如果您对于开源的跨平台图像处理软件 GIMP 感兴趣,却又找不到好的教程的,那么可以看看这个。
曾为 Linux Format 杂志做个系列 GIMP 教程的 Michel J. Hammel最近放出最新18个 GIMP 教程的高清 PDF,允许个人免费使用及分发(严禁商用)。
18 个教程为:
  1. Product design for geeks
  2. Shattered face
  3. Leopard-style icons
  4. Sin City style
  5. Summer of love
  6. Travel to the stars
  7. Going to warp speed
  8. Create a fire goddess
  9. Decay in the city
  10. Enhance the interface
  11. iPod fun
  12. Use other tools
  13. Text effects
  14. 3D effects in Gimp
  15. Speedy colour fixes
  16. Printing and colour
  17. Know your selections
  18. Creative text with Gimp
整个18个教程被打包在一个 90M 的压缩包中,请前往 TuxRadar 页面下载。

2010/08/24

使用grep恢复被删文件内容

在Unix/Linux下,最危险的命令恐怕就属rm命令了,每次在root下使用这个命令的时候,我都要盯着命令行看上几分钟才敢把回车敲下去。以前,看到同事在脚本中使用rm命令 —— rm {$App_Dir}/* 。因为脚本没有判断变量$App_Dir是否为空,结果,在一次用root操作的时候,整个操作系统一下就不见了,还好只是开发机。从此,我们大家都再也不敢使用rm命令了。
这里给大家介绍一个小技巧用来恢复一些被rm了的文件中的数据。我们知道,rm命令其实并不是真正的从物理上删除文件内容,只过不把文件的inode回收了,其实文件内容还在硬盘上。所以,如果你不小删除了什么比较重要的程序配置文件的时候,我们完全可以用grep命令在恢复,下面是一个恢复示例:
1grep -a -B 50 -A 60 'some string in the file' /dev/sda1 > results.txt
说明:
  • 关于grep的-a意为–binary-files=text,也就是把二进制文件当作文本文件。
  • -B和-A的选项就是这段字符串之前几行和之后几行。
  • /dev/sda1,就是硬盘设备,
  • > results.txt,就是把结果重定向到results.txt文件中。
如果你幸运的话,你就可以看到被恢复的内容了。这正是Unix的简单哲学(详见《Unix传奇下篇》)—— 所有的设备都是文件。
当然,我还是建议你把root用户的rm的命令用alias换成别一个脚本,那个脚本会帮你把删除的文件放到某个地方。

2010/08/22

介绍 urxvt 插件一枚: vim-scrollback

这个插件和 urxvt 自带的 searchable-scrollback 插件一样提供了一种在终端的命令行输出结果中搜索或复制关键字的快捷方式,vim-scrollback 将这种快捷方式 Vim 行为化了。

简单来说,通过这个插件,你可以用 Vim 的方式操纵终端。假设你在命令行查看 ls 的 man 手册,看到有一个网址,你想用浏览器看看这个网址,但你又懒得去动鼠标:
1. Alt-v 启用 vim-scrollback 模式
2. 移动光标到网址处
3. 键入 gf 两个字符
4. Esc 或 Ctrl-C 可退出 vim-scrollback 模式
支持普通模式
 
h j k l
w e b
0 _ $
ctrl-u ctrl-d
gg G
 
支持可视模式(甚至支持列模式)

V v ctrl-v
gv
 
支持搜索(遗憾的是不支持中文搜索)

/ - searches up
? - searches down
n - next in current direction
N - next in opposite direction
* - search for word under the cursor
 
其他更多
 
gf - 允许你打开当前光标下的超级链接
如果你感兴趣,可以从这里下载 vim-scrollback 保存到本地某目录下,配置 ~/.Xresources 或 ~/.Xdefaults

添加下面几行内容:


urxvt.perl-lib: /Your/Path/vim-scrollback
urxvt.perl-ext-common: vim-scrollback
urxvt.vim-scrollback-paste: none

Read More: 
No related posts

文章来自:http://linuxtoy.org/archives/vim-scrollback.html

2010/07/03

JStock 1.0.5m 发布,免费炒股软件

JStock 是个股市软件。http://jstock.sourceforge.net
该版本主要改进内容:
支持简体中文显示,及许多错误修正
我们最近打算支援中国股市。
因为工程庞大,我们每当完成小阶段,就会开始发布。
我们最近让JStock能支援中文显示,欢迎大家下载尝试。我们的中文不好。如果翻译得不对,请让我们知道。
我们也希望能吸引开发人员,翻译人员(翻译软件,翻译网页)。。。加入我们的团队。
https://sourceforge.net/apps/mediawiki/jstock/index.php?title=Main_Page


原文:http://www.oschina.net/news/10247/JStock-1-0-5m

2010/05/17

没事就和朋友下下棋,pidgin象棋插件偷跑版

gmchess是一款由阳光灿烂的lerosua写的linux下开源的中国象棋程序,使用gtkmm和C++完成。支持人机对战和人人对战。但是之前只能在同一台机子上进行人人对战,这显然很不方便。
于是牛逼的lerosua又给我们带来了gmchess的pidgin对战插件,功能不必多说,大家也能猜到,肯定是通过pidgin,和好友在线下象棋了~
下面来看两个截图:
这是装了插件以后的pidgin窗口,可以看到已经多了一个很“帅”的按钮了~

如果你和你的好友,都装了这个插件的话,你一点这个“帅”,对方一接受,就会出来gmchess的对战窗口了,gmchess的对战模式大致和人机对战一致,只是对方换成了有血有肉的人了,哈哈,如图:

如果感兴趣的话,在这里下载最新的代码,注意gmchess-0.29.0.tar.bz2和pidgin-gmchess-0.01.tar.gz都要下载安装哦。
由于这个目前是偷跑版,也可以理解成是alpha版,所以难免会有点小问题,遇到bug或疑似bug的话,大家尽情地报告bug去,哈哈。
再八卦一下,gmchess里的提示音很多都是人声哦,而且这些声音正是出自lerosua的老婆,还蛮好听的呢,哈哈。

原文:http://li2z.cn/2010/05/16/pidgin-gmchess/

一个支持上传的简单http server


{ 撰文/bones7456 }
现在,很多人都知道,Python 里有个 SimpleHTTPServer,可以拿来方便地共享文件。比如,你要发送某个文件给局域网里的同学,你只要 cd 到所在路径,然后执行这么一行:
python -m SimpleHTTPServer
人家就可以通过 http://你的IP:8000 来访问你要共享的文件了。像我早已把这个命令做了 alias。但是,某一天,你需要从同学哪里复制一个文件到本机,然后你就会跟你同学说,XX,共享下某目录。当你以为可以用 HTTP 来访问他的 8000 端口的时候,他却告诉你,不好意思,我是 Windows 啦~~当然你可以选择在他 Windows 里装个 Python,也可以选择使用 Samba、FTP 等其他方式,但是有没有和之前一样简单的方式呢~当然了,这时候,你就需要一个支持上传的简单 HTTP Server,也就是我这个:SimpleHTTPServerWithUpload.py,哈哈。然后你开个服务,让人家上传即可。
其实这个就是修改自 SimpleHTTPServer 的,只不过我给它加上了最原始的上传功能,安全性方面没有验证过,不过理论上应该不会没人一直开着这个吧?另外,我对 RFC1867 的理解不一定透彻,所以,Use on your own risk!
截图如下:
代码在此,单文件、零配置,直接用 Python 运行。


原文:linuxTOY

2010/05/16

HTML 简史

新闻来源:A List Apart
HTML 是 Web 统一语言,这些容纳在尖括号里的简单标签,构成了如今的 Web。1991 年,Tim Berners-Lee 编写了一份叫做 “HTML 标签”的文档,里面包含了大约20个用来标记网页的 HTML 标签。他直接借用 SGML 的标记格式,也就是后来我们看到的 HTML 标记的格式。本文讲述了 HTML 这门 Web 标记语言的发展简史。
从 IETF 到 W3C: HTML 4 之路 
HTML 1 并不曾存在,HTML 的第一个官方版本就是由 IETF (互联网工程任务组) 推出的 HTML 2.0。问世之前,这个版本中的很多细则已经被实现,比如,1994年的 Mosaic 浏览器已经实现了在文档中嵌入图片的方法,后来 HTML 2.0 便吸纳了 img 这个标签。

后来,W3C 取代 IETF 的角色,成为 HTML 的标准组织,1990年代的后半页,HTML 的版本被频繁修改,直到1999年的 HTML 4.01,至此,HTML 到达了它的第一个拐点。

XHTML 1: XML 风格的 HTML 

HTML 在 HTML 4.01 之后的第一个修订版本就是 XHTML 1.0,其中 X 代表 “eXtensible” ,扩展,当然也有人将之解读为 “eXtreme”,极端。XHTML 1.0 是基于 HTML 4.01 的,并没有引入任何新标签或属性,唯一的区别是语法,HTML 对语法比较随便,而 XHTML 则要求 XML 般的严格语法。

使用严格的语法规范并非坏事,要求开发者使用单一的代码风格,比如,HTML 4.01 允许你使用大写或小写字母标识标记元素和属性,XHTML 则只允许小写字母。XHTML 1.0 的推出刚好碰上了 CSS 的崛起,Web 开发设计者们开始意识到 Web 标准问题,基于 XHTML 的严格语法规范被视为编写 HTML 代码的最佳实践。

于是,W3C 推出 XHTML 1.1。

如果说 XHTML 1.0 是 XML 风格的 HTML,XHTML 1.1 则是货真价实的 XML。这意味着 XHTML 1.1 无法使用 text/html mime-type 直接输出,然而,如果 Web 开发者使用 XML mime-type,则当时的主流浏览器,IE 则压根不支持。看上去,W3C 似乎正在与当时的 Web 脱节。

出力不讨好的 XHTML 2 
对 W3C 而言,到了 HTML 4 已经是功德圆满,他们的下一步工作是 XHTML 2,希望将 Web 带向 XML 的光明未来。虽然 XHTML 2 听上去和 XHTML 1 类似,它们却有很多差别,XHTML 2 不向前兼容,甚至不兼容之前的 HTML。它是一种全新的语言,赤条条来去无牵挂。这实在是一场灾难。

WHATWG:与 W3C 决裂 
W3C 闭门造车的作风引起了一些人的不满,来自 Opera, Apple, 以及 Mozilla 的代表开始表达反对声音。2004年,Opera 的 Ian Hickson 提议在 HTML 基础上进行扩展以适应新的 Web 应用,该提议遭到 W3C 的拒绝。于是,他们自发组织成立了超文本应用技术工作组,就是 WHATWG。

从 Web Apps 1.0 到 HTML5 
从一开始,WHATWG 就和 W3C 走不同的路线,W3C 对问题的讨论是集体投票,而 WHATWG 则由主笔 Ian Hickson 定度。表面上看,W3C 更民主,然而事实上,各种内部纷争会使一些决议限于泥潭,在 WHATWG,事情的进展会更容易,不过,主笔的权力并非无限大,他们的委员会可以对那些过于偏执的主笔进行弹劾。

一开始,WHATWG 的主要工作包括两部分,Web Forms 2.0 和 Web Apps 1.0,它们都是 HTML 的扩展,后来,他们合并到一起成为现在的 HTML5 规范。

言归于好 

在 WHATWG 致力于 HTML5 的同时,W3C 继续他们的 XHTML 2.0,然而,他们慢慢地陷入困境。

2006年10月,Web 之父 Tim Berners-Lee 发表了一篇博客文章,表示,从 HTML 走向 XML 的路是行不通的,几个月后,W3C 组建了一个新的 HTML 工作组,他们非常明智地选择了 WHATWG 的成果作为基础。这一转变带来一些困惑,W3C 同时进行这两套规范,XHTML 2 和 HTML 5 (注意,W3C 的 HTTML 5 在 5 之前有个空格,而 WHATWG 的 HTML5 则没有空格),而 WHATWG 也在进行着同样的工作。

XHTML 已死: XHTML 语法永存 

这一混乱局面到了 2009 年开始变得清晰,W3C 宣布终止 XHTML 2 的工作,这是一份关于 XHTML 2 的迟到的讣告。这一消息被那些 XML 的反对者视为珍宝,他们借此嘲笑那些使用 XHTML 1 规范的人,然而他们似乎忘记了,XHTML 1 和 XHTML 2 是截然不同的东西。于此同时,XHTML 1 规范的制定者担心,XHTML 1 中的严格语法规范会被 HTML5 弃用,这种担心后来证明是多余的,HTML5 既支持松散语法,也支持 XHTML 1 般的严格语法。

HTML5 路线图 
HTML5 的现状是,它不再象以前那样让人困惑,然而仍不够明朗。有两个组织在同时制定它的规范,这两个组织有着完全不同的行事风格,WHATWG 是先买后尝,W3C 是先尝后买,他们形成了一个不太靠谱的联姻,最终人们必将面临一个 HTML5 还是 HTML 5 的问题。

更让开发者困惑的是,他们什么时候才可以试水 HTML5。

在一次访谈中,Ian Hickson 提到了 2022,表示要到那时 HTML5 才会形成"推荐标准",此话一出,立刻招来 Web 设计者们的愤怒,尽管他们不知道推荐标准时什么意思,但他们明白,2022 已经是猴年马月的事了。

这还不算,更重要的是,这个推荐标准涉及两套规范,考虑到 HTML5 标准的规模,这个日期还是太乐观了,毕竟,各大浏览器以往对既有标准的兼容并不遂人意,想当初,IE 花了10年才接纳 abbr 这个标签。

2012 年,HTML5 会被接纳为候选标准,这将是 HTML5 真正开始发力的日子。对 Web 开发设计者来说,这并不重要,重要的是浏览器的支持,就像 CSS 2.1,当有浏览器开始支持这一规范的时候,就有开发设计者在使用了,倘若必须等到所有浏览器都支持才开始入手,恐怕我们现在还在等待中。

HTML5 也一样,并不会有一个时间点,宣布 HTML5 已经准备妥当,相反,我们会先开始使用它的部分功能,HTML5 并不是一个从零开始全新的东西,它是旧的 HTML 标准的改进,事实上,不管你正在使用的 HTML 是哪个版本,你已经在使用 HTML5 了。
本文国际来源:A List Apart A Brief History of Markup (原文作者:Jeremy Keith)
中文编译来源:锐商企业CMS 网站内容管理系统 官方网站

Ubuntu 10.10可能使用Btrfs为默认文件系统

EXT文件系统家族如ext2、ext3、ext4,多年来一直是众多发行版默认的文件系统,桌面发行版Ubuntu当然也不例外。然而现在事件正在发生改变,Ubuntu 10.10 Maverick Meerkat可能不再默认使用ext4文件系统。 
Canonical公司雇员、Ubuntu开发主管Scott James Remnant在博客上说,他们正在设法让btrfs作为Ubuntu 10.10的可选文件系统,而且不排除让btrfs作为默认文件系统。Scott指出,预计到内核2.6.35发布之时btrfs将不会在kernel配 置文件中标记为是一种“实验性”的文件系统,Ubuntu Maverick Meerkat预计将使用2.6.35。

2010/04/09

在Linux下挂载U盘,硬盘,光驱及自动化挂载管理

1. Linux挂载U盘:
插入u盘到计算机,如果目前只插入了一个u盘而且你的硬盘不是scsi的硬盘接口的话,那它的硬件名称为:sda1。 在mnt目录下先建立一个usb的目录:
(如:[root@localhost root]# mkdir /mnt/usb)

挂 载U盘:mount -t vfat /dev/sda1 /mnt/usb
卸载U盘:umount /mnt/usb
删除usb目 录:rm -rf /mnt/usb

2. Linux挂载硬盘:

挂载FAT32文件系统最简单的用法
mount /dev/hda6 /mnt/wine

/dev/hda6是Windows的E盘,/mnt/wine是目录加挂点。Linux会识 别到/dev/hda6分区的文件系统类型是什么,然后加挂的。当然也可以指定分区的文件系统类型,命令如下:
mount -t vfat /dev/hda6 /mnt/wine

在实际中操作中,直接加挂一个windows的分区,中文的文件名和目录名会出现乱码,为了避免 这种情况可以指定字符集,命令如下:
mount /dev/hda6 /mnt/d -o codepage=936,iocharset=cp936
mount -t vfat /dev/hda6 /mnt/d -o codepage=936,iocharset=cp936
mount -t vfat -o iocharset=cp936,codepage=936 /dev/hda6 /mnt/wine

注意:cp936是指简体中 文,cp950是指繁体中文。

卸载所挂的硬盘 umount /mnt/wine
删除所挂的硬盘 rm -rf /mnt/wine

挂载NTFS文件系统
在目前多数的Linux版本上,需要重编译Linux核心才能,加挂NTFS分区(编译 方法请参阅其它文章)。核心支持NTFS后,可以用以下命令加挂:
mount -t ntfs /dev/hda2 /mnt/c

同 样对于中文的文件名和目录名会出现乱码的问题可以指定字符集,不过和加挂vfat分区不同,实际中用以下命令是可行的:
mount -t ntfs -o iocharset=cp936 /dev/hda2 /mnt/c -r
mount -t ntfs -o iocharset=cp936,rw /dev/hda2 /mnt/c

注意:cp936是指简体中文,cp950是指繁体中文。
卸 载删除同上。

3. Linux自动挂载硬盘

打开/etc找到里面的fstab文件进行编辑,如果你是以管理员身份登入的 话,可以直接右键->打开方式->gedit,可以直接在后面追加行:
/dev/hda6 /mnt/wine vfat codepage=936,iocharset=cp936,defaults,umask=0 0 0
/dev/hda5 /mnt/wind vfat codepage=936,iocharset=cp936 0 0


4. Linux挂载光驱:
命令: mount -t iso9660 /dev/hdc /mnt/cdrom
卸载删除同上。


原文:http://aolinux.blogspot.com/2009/04/linuxu.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+aolinux+%28%E5%99%A2%EF%BC%81Linux%29

mplayer-wrapper:自动从射手网下载字幕的 MPlayer 脚本

mplayer-wrapper是Mplayer的一个简单的命令行前端。能实现如:自动视频,从上次结束的位置继续播放,自动字幕下载等功能。
地址:http://gosubi.me/adow/mplayer-wrapper

2010/02/14

编译Linux内核

1.需要先安装编译环境
进入 root 帐户:
> su
输入密码
安装必要的工具:
> apt-get install build-essential
(安装 gcc, make 等)
> apt-get install libncurses-dev
(安装 make menuconfig 时必须的库文件)
> apt-get install kernel-package, fakeroot
(Debian 系统里生成 kernel-image 的一些配置文件和工具)
> apt-get install initramfs-tools, module-init-tools
2.安装 kernel-source:
可以从 Ubuntu 的源安装,这样的好处是简单,而且安装的内核是Debian 化了的,缺点是内核不是最新的内核。
> apt-get install linux-source
也可以从 www.kernel.org 下载内核安装。kernel.org 的境象应该很多,选一个最快的来下载,因为要下载的文件很大。我这里介绍的是安装 2.6.24 的内核,加上了 ck 的补丁。
下载 linux-2.6.24.tar.bz2 和 patch-2.6.24.bz2 ,并且把它们都存放在 /usr/src 目录下。
> tar xvjf linux-2.6.24.tar.bz2
> ln -s linux-2.6.24 linux
(如果已经有了 linux 目录,则要先将其删除)
> cd linux
> bzcat ../patch-2.6.24.bz2 | patch -p1
至此,内核源文件以及补丁就都安装好了。
3.编译内核
把源码包解压到 /usr/src/linux-2.6.24,然后在/usr/src/下创建一个名为linux的指向/usr/src/linux-2.6.24的链接(link)。
在shell中输入
root@FE2000:~# cd ..
root@FE2000:/# cd /usr/src/linux
root@FE2000:/usr/src/linux# make mrproper
root@FE2000:/usr/src/linux# make menuconfig
或者make gconfig
此时qconf已经读取了默认配置,你也可以这样做:
在qconf中点File->Load 去读取其他的设置文件。
比如 /boot/config-2.6.18-23-686
下面在qconf中配置.config文件。选“Y”(打勾)就是把它编译到内核中,选“M”(打点)把它编译成模块,供内核动态调用。选“N”就是不安装。也可以保持默认选项……
下面只是简单提几项:
General setup
Optimize for size (Look out for broken compilers!) 发烧友可以选Y以获得更小的内核。
Processor type and features
Symmetric multi-processing support 如果你没有多线程处理器这个可以选N
Processor family 根据你的CPU来选择。
High Memory Support 1G以上内存的选“4GB”, 1G以下的,将来也不打算升级到1G的,选“off”.
Bus options (PCI, PCMCIA, EISA, MCA, ISA)
PCI support
PCI Express support 老式机器没有PCI-E设备的可以选N
ISA support 较新的新机器没有ISA设备,可以选N
MCA support 一般选N
NatSemi SCx200 support 一般选N
PCI Hotplug Support
Support for PCI Hotplug (EXPERIMENTAL) 如果没有PCI热插拔设备,选N
Device Drivers
Block devices
Packet writing on CD/DVD media
Enable write caching (EXPERIMENTAL) 如果你有刻录机,想启用写缓存功能,选Y
ATA/ATAPI/MFM/RLL support
Include IDE/ATA-2 DISK support 如果你的/boot是放在IDE硬盘上,那么这里一定要选Y,选M都不行。否则启动时会出现“waiting for root file system”的提示而停滞不前。
SCSI device support 如果有SATA硬盘,就选Y
SCSI disk support 如果你的/boot放在SATA硬盘上,一定要选Y。
Character devices
I2C support 一般可以选Y或者M
Graphics support 不建议把显卡驱动编译进内核。,选M,编译成模块方便日后升级驱动。
Support for frame buffer devices
VESA VGA graphics support 可以选Y
Logo configuration
Bootup logo 如果想看到Linux启动logo,选Y
Sound
Sound card support 选Y, 除非你没有声卡
其他的驱动,酌情添加删除,根据机器配置删除不需要的驱动可以缩短编译时间。你可以在命令行下输如lspci或者dmesg查看硬件信息。
File systems
CD-ROM/DVD Filesystems
ISO 9660 CDROM file system support 一般选Y
DOS/FAT/NT Filesystems
VFAT (Windows-95) fs support 有FAT32分区就选Y吧
NTFS file system support 有NTFS分区就选Y吧
NTFS write support 如果想对 NTFS分区进行写操作,选Y
Native Language Support
Simplified Chinese charset (CP936, GB2312) 选Y或者M使读取FAT分区不会遇到中文乱码现象
设置完毕后,按一下保存按钮,无论原先载入的是哪个配置文件,qconfig都将设置保存到 /usr/src/linux/.config 这个隐含文件。
下面输入make开始编译,这一过程大约需要40-100分钟,具体的要看你的机器速度啦……
root@FE2000:/usr/src/linux# make
安装内核
root@FE2000:/usr/src/linux# make install
编译模块
root@FE2000:/usr/src/linux# make modules
安装模块
root@FE2000:/usr/src/linux# make modules_install
然后
root@FE2000:/usr/src/linux# cd /
root@FE2000:/usr/src/linux# /usr/sbin/mkinitramfs -o /boot/initrd.img-2.6.24 2.6.24
如果有出错提示,可能是因为 initramfs-tools 没有装,先把它装上吧。
如果没有这一步骤,那么开机就会出现提示
……
initrd /initrd.img-2.6.24
Error 15: File not found
4.修改内核启动选项
最后打开 /boot/grub/menu.lst
在 ## ## End Default Options ## 下面添加类似下面的两段
title Ubuntu, kernel 2.6.24
root (hd0,4)
kernel /vmlinuz-2.6.24 root=/dev/hdd6
initrd /initrd.img-2.6.24
savedefault
boot
title Ubuntu, kernel 2.6.24 (recovery mode)
root (hd0,4)
kernel /vmlinuz-2.6.24 root=/dev/hdd6 ro single
initrd /initrd.img-2.6.24
boot
注意 root和kernel字段要模仿menu.lst下面已有的内容写。
下面是 (hd0,4),那么你也写(hd0,4),下面写root=/dev/hdd6,你也写root=/dev/hdd6,只是内核的版本号改为现在编译的版本号。
然后把下面重复的savedefault删除。
重新启动计算机,在GRUB中选择新内核启动。(仅供参考,实际应用中还有很多不同之处欢迎讨论)

2010/01/27

在Ubuntu中配置可供Windows主机共享上网的VPN服务器

原文发表于: http://xiaogaozi.blogspot.com/2010/01/ubuntuwindowsvpn.html

VPN (Virtual Private Network, 虚拟专用网) 是一种在现有网络基础上建立的虚拟网络, 主要用于帮助两个网络通过VPN隧道 (tunnel) 进行通信. VPN的好处在于网络A中的电脑A1通过隧道与网络B中的电脑连接上后, A1将能够使用网络B的网络环境. VPN分为加密与不加密两种, 通常我们使用的都是加密VPN. 加密VPN常用的协议有SSL、PPTP等, 其中PPTP是Windows系统内置的协议, 因此如果想要搭建一个支持Windows电脑接入的VPN服务器, 最好是使用PPTP服务器软件. 当前VPN的主要用途有在异地接入一个内部网络, 以及翻越功夫网.

注意: VPN服务器必须是具有外网IP的电脑, 如果IP地址属于10.0.0.0~10.255.255.255, 172.16.0.0~172.31.255.255, 192.168.0.0~192.168.255.255这三个IP地址段, 则不具备搭建VPN服务器的条件.
Poptop是一款Linux下的PPTP服务器软件, 今天我们就主要借助它来完成一个VPN服务器的配置. Ubuntu系统使用如下命令安装Poptop:
$ sudo apt-get install pptpd
如果你的Linux的内核版本低于2.6.15, 那么需要先检查一下是否支持MPPE:
$ sudo modprobe ppp-compress-18 && echo "success"
若是没有输出“success”则证明内核不支持, 可以跟随这里的步骤进行内核的配置.
Poptop安装完毕之后需要简单配置一下, 打开“/etc/pptpd.conf”文件, 添加下面两行, 或者这个文件已经有了一些示例, 只需要去掉注释符号.
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245
“localip”表示VPN隧道中服务器 (server) 的IP地址, “remoteip”表示VPN隧道中客户端 (client) 可以分配的IP地址. 关于“pptdp.conf”文件的更多选项, 可以阅读它的man page.
然后设置用于登录的用户名和密码, 打开“/etc/ppp/chap-secrets”文件, 添加下面一行, 中括号部分代表需要配置的地方:
[username] pptpd [password] *
最后重启Poptop:
$ sudo /etc/init.d/pptpd restart
现在试试用其它电脑是否可以成功连上, 注意客户端填写的IP地址是VPN服务器的外网IP, 而不是刚才配置的“localip”.
虽然可以成功建立VPN连接, 但通常情况下还不能通过VPN服务器连接到Internet. 原因有多种, 先来看看客户端通过VPN服务器与Internet上的服务器通信的全过程:
client <--> client ppp0 <--> VPN server ppp0 <--> VPN server <--> VPN server eth0 <--> Internet server eth0 <--> Internet server
“ppp0”其实是VPN虚拟的一个网络接口 (可以想象成这是一个虚拟的网卡), VPN隧道就是通过客户端与服务器的这两个网络接口建立的. 而“eth0”则代表服务器上真实存在的物理网卡, VPN服务器与外网通信就需要通过它. 具体流程是: 客户端通过“ppp0”向VPN服务器发出请求, VPN服务器侦测到之后, 再将请求通过“eth0”转发出去, 当请求到达目的地之后, Internet服务器就根据请求做出相应的回复, 这个回复再按照刚才来的路径返回到客户端, 这样客户端就成功与Internet服务器完成一次通信.
上面图示中的箭头部分 (“<-->”) 就是可能造成无法连接Internet的关键, 因此需要针对每个部分一一排查. 这里只对可能性最大的两个地方进行介绍, 想要了解每一个关键点的检测方法的同学可以阅读“Diagnosing Forwarding on pptpd”这篇文章.
  1. 是否已经打开IP转发?

    查看“/proc/sys/net/ipv4/ip_forward”文件中的值是否为“1”, 如果不是, 则需要在“/etc/sysctl.conf”文件中添加“net.ipv4.ip_forward=1”, 然后执行以下命令:
    $ sudo /etc/init.d/procps restart
    
  2. 是否在VPN服务器上设置了对于客户端IP地址的NAT?

    执行下面的命令查看表中是否有相应的表项:
    $ sudo iptables --table nat -L POSTROUTING
    
    如果没有则执行以下命令:
    $ sudo iptables --table nat --append POSTROUTING --out-interface eth0 --jump MASQUERADE
    
在完成上面两个检查之后, 应该就可以成功通过VPN服务器与Internet进行通信, 一个VPN服务器也基本配置完毕.

2009/12/10

翻译:Xen体系结构

翻译说明

在研究和学习虚拟化技术的过程中看了很多文档,很多是翻译成中文的,对那些无私的为大家服务的贡献者很是敬佩,同时也触发了我为大家做些贡献的愿望。事实上翻译和整理的过程也是自己进一步学习的过程。由于自己的水平有限,翻译过程中的错误欢迎大家批评指正。
开源,很好!

概要

本文档描述的是Xen hypervisor的宏观体系结构、辅助工具以及构建一个完整虚拟化环境所需的应用程序。本文的综合介绍了基于Xen3.2(2008年1月)的Xen体系结构,更详尽的描述请参考Xen books。

Xen组成要素

一个Xen虚拟化环境由以下相互配合的元素构成:
  • Xen Hypervisor
  • Domain 0
  • Domain管理和控制工具
  • Domain U PV客户系统
  • Domain U HVM客户系统
下面的图形是对这些要素基本组织的描述




Xen Hypervisor
Xen Hypervisor是一个介于硬件和操作系统之间的软件层,它负责在各虚拟机之间进行CPU调度和内存分配(partitioning)。Xen Hypervisor不仅抽象出硬件层,同时控制虚拟机的执行,因为这些虚拟机共享同一个处理环境。Xen Hypervisor不会处理网络、存储设备、视频以及其他I/O。

Domain 0
Domain 0是一个修改过的Linux kernel,是唯一运行在Xen Hypervisor之上的虚拟机,它拥有访问物理I/O资源的权限,同时和系统上运行的其他虚拟机进行交互。Domain 0需要在其它Domain启动之前启动。
Domain 0中包含两个驱动:Network Backend Driver和Block Backend Driver,分别负责处理来自Domain U的网络和本地磁盘请求。Network Backend Driver直接和本地网络硬件进行通信以处理所有来自Domain U上客户操作系统的网络请求。Block Backend Driver和本地存储设备进行通信以处理来自Domain U的读写请求。


Domain U
运行在Xen Hypervisor上的所有半虚拟化(paravirtualized)虚拟机被称为“Domain U PV Guests”,其上运行着被修改过内核的操作系统,如Linux、Solaris、FreeBSD等其它UNIX操作系统。所有的全虚拟化虚拟机被称为 “Domain U HVM Guests”,其上运行着不用修改内核的操作系统,如Windows等。
Domain U PV Guests的内核知道它自己不能直接访问物理硬件,因为他知道有其他的虚拟机也运行在同一个环境中。而Domain U HVM Guests的内核不知道他正在和其他虚拟机共享一个处理环境,它认为它运转在物理硬件上。
Domain U PV Guests包含两个驱动:“PV Network Driver”和“PV Block Driver”。


Domain U HVM Guests虚拟机内没有PV Driver,而是在Domain 0里为每一个HVM Guest启动一个特殊守护进程:Qemu-dm,由Qemu-dm负责客户操作系统的网络和磁盘请求。
Domain U HVM Guests必须进行初始化为某类机器,所以要在Domain U上附加一个软件:Xen虚拟固件,来模拟BIOS。关于Xen虚拟化固件的更多信息请参考后面的内容。





域(Domain)管理和控制
开源社区提供了一系列的域管理和控制工具(Linux守护程序)。这些服务运行在Domain 0,他们支持所有对虚拟化环境的管理和控制,下面的几个图中为了更清楚的说明将这些守护进程画在了Domain 0的外部。
Xend
Xend是一个python应用程序,它是Xen虚拟化环境的系统管理工具。它通过对libxenctrl库的调用实现对Xen Hypervisor的请求。Xend处理的所有请求都是通过Xm工具提供的XML RPC接口提交的,见下图。



Xm
Xm是一个命令行工具,它接受用户的输入并把指令通过XML RPC传输给Xend。
Xenstored
Xenstored维护一个信息档案,包括内存和建立在Domain 0与Domain U之间的事件通道。Domain 0通过改变这个档案来设置和其他虚拟机的设备通道。(具体信息请参考Domain 0和Domain U的通信)
Libxenctrl
Libxenctrl是一个C语言的库,它为Xend提供与Xen Hypervisor通信的能力。privcmd是Domain 0中的一个特殊驱动,它负责提交请求到hypervisor。



Qemu-dm
每一个运行在Xen虚拟化环境下的HVM客户系统都有他自己的Qemu守护进程。该进程处理来自HVM客户系统的所有网络和磁盘请求,以支持Xen虚拟化 环境下的全虚拟化。Qemu必须存在于Xen hypervisor之外,因为它需要访问网络和I/O设备,所以他运行在Domain 0 。
现在已经有一个新的工具来代替Qemu对HVM客户系统的支持,这就是Stub-dm。它是为Xen的将来版本开发的,Xen3.2还不具备该特性,可能发布在Xen3.3中。
Xen虚拟化固件
Xen虚拟化固件是一个虚拟的BIOS,它被加载到每一个Domain U HVM Guest以提供标准的启动指令,保证客户操作系统在正常启动过程中能得到标准的PC兼容的软件环境。

Xen操作

这部分描述一个半虚拟化的Domain U如何通过Xen hypervisor、Domain 0 与外部的网络以及存储进行通信的。
Domain 0与Domain U的通信
前面讲到过,Xen Hypervisor不会支持网络和磁盘请求的,因此一个PV客户系统必须通过和Xen Hypervisor、Domain 0通信,来实现网络和磁盘请求。下面这个例子描述了PV客户系统如何将一个数据写到本地硬盘。
PV客户系统的开设备驱动程序接收到一个写请求,并且通过Xen Hypervisor写数据到适当的本地内存中,该内存是和Domain 0共享的。在Domain 0 和Domain U之间存在一个事件通道(event channel),通过该通道二者进行异步的域间中断通信。Domain 0会接收到一个来自Xen Hypervisor的中断,触发PV Block Backend Driver访问上述的内存,读取来自PV客户系统的数据,然后将这些数据写入硬件磁盘。
下图中事件通道表示为连接Domain 0与Domain U的一个区域,这是系统工作流的一个简化。事实上事件通道运行在Xen Hypervisor,通过Xenstored中的特定中断实现,提供Domain 0与Domain U之间的快速共享内存。
见下图。



术语表
C: http://www.cprogramming.com/; a computer programming language
Daemons: http://en.wikipedia.org/wiki/Daemon_(computer_software); a program running in the background rather than under direct control of a user
Driver: http://en.wikipedia.org/wiki/Device_driver; program allowing software to interact with hardware
Full Virtualization: http://en.wikipedia.org/wiki/Full_virtualization; a virtual machine not aware of its virtualization
Interrupt:  http://en.wikipedia.org/wiki/Interrupt; signal from hardware to software requesting a specific action in software
Kernel: http://en.wikipedia.org/wiki/Linux_kernel; the central component of a computer operating system
Paravirtualized: http://en.wikipedia.org/wiki/Paravirtualization; virtual machine running on a hypervisor that is aware of it being virtualized]
Python: http://www.python.org/; a dynamic object oriented programming language
ROM BIOS: http://en.wikipedia.org/wiki/BIOS; software instructions run on a machine when turned on
XML PRC: http://www.xmlrpc.com/; method for an application to leverage another application using HTTP for the remote procedure call and XML as the encoding




译者:BiaBear
博客:http://www.lupaworld.com/386879

Nessus 4.2开源漏洞扫描工具发布


NessusLogo-9e60aec32eb934b1Nessus是一款非常优秀的开源漏洞扫描工具,被认为是目前全世界最多人使用的系统漏洞扫描与分析软件。该软件的4.2版本发布,这个新版本是有史以来发动最大的一次,首先就是增加了一个基于Web的用户界面,界面的美工做到极致,让人赞叹,可以见系统截屏。这个Web界面的推出,意味着是一个新的客户端,用户可以通过浏览器来管理设置系统。
详细功能请查看官方功能描述、下载、文档、插件。

转载自Osss.cn 开源社区

Musca + Xfce4-panel:接近完美

{ 撰文/吴吉庆 }
我上篇讲 Musca 配置的文章中所说的用 Conky 显示窗口列表,效果并不是很好,文本经常显示不全。而且也不能像真的任务栏那样操作。
PyPanel 也不行,根本不能显示窗口列表。
我一开始还以为是 Musca 不符合 MWM 规范呢,但看到一个网友用 Tint2 可以显示窗口列表。 他告诉我说,就 PyPanel 不行,别的 panel 都可以。 原来这样,看来 Musca 都可以嵌入到 GNOME 中用了,真的很不错啊。
我试用了 Tint2,基本满意,但是有两个问题:
  1. 它对系统托盘程序的支持并不好。它对方形的托盘图标显示没问题,但是对于 Workrave 这样的长矩形托盘也只能显示个方形,显示不全。
  2. 用鼠标激活窗口时,任务栏上的窗口才显示被激活的状态,用快捷键激活窗口时,任务栏上所有的窗口都没有被激活的状态。
我于是试了下 Xfce4-panel,效果几乎完美。Tint2 的那两个问题都解决了。 而且对工作区的显示非常棒,你看截图右下角的工作区显示。 可能美中不足的就是它是 Xfce4 的组件,不能独立安装,也不能独立调节它的显示外观。希望朋友们提出更好的方案。

《SED 单行脚本快速参考》的 awk 实现

sed 和 awk 都是 Linux 下常用的流编辑器,他们各有各的特色,本文并不是要做什么对比,而是权当好玩,把《SED 单行脚本快速参考》这文章,用 awk 做了一遍~ 至于孰好孰坏,那真是很难评论了。一般来说,sed 的命令会更短小一些,同时也更难读懂;而 awk 稍微长点,但是 if、while 这样的,逻辑性比较强,更加像“程序”。到底喜欢用哪个,就让各位看官自己决定吧!
文本间隔:
# 在每一行后面增加一空行
sed G
awk '{printf("%s\n\n",$0)}'
# 将原来的所有空行删除并在每一行后面增加一空行。
# 这样在输出的文本中每一行后面将有且只有一空行。
sed '/^$/d;G'
awk '!/^$/{printf("%s\n\n",$0)}'
# 在每一行后面增加两行空行
sed 'G;G'
awk '{printf("%s\n\n\n",$0)}'
# 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
sed 'n;d'
awk '{f=!f;if(f)print $0}'
# 在匹配式样“regex”的行之前插入一空行
sed '/regex/{x;p;x;}'
awk '{if(/regex/)printf("\n%s\n",$0);else print $0}'
# 在匹配式样“regex”的行之后插入一空行
sed '/regex/G'
awk '{if(/regex/)printf("%s\n\n",$0);else print $0}'
# 在匹配式样“regex”的行之前和之后各插入一空行
sed '/regex/{x;p;x;G;}'
awk '{if(/regex/)printf("\n%s\n\n",$0);else print $0}'
编号:
# 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符”
# (tab,见本文末尾关于’\t’的用法的描述)而不是空格来对齐边缘。
sed = filename | sed 'N;s/\n/\t/'
awk '{i++;printf("%d\t%s\n",i,$0)}'
# 对文件中的所有行编号(行号在左,文字右端对齐)。
sed = filename | sed 'N; s/^/     /; s/ *\(.\{6,\}\)\n/\1  /'
awk '{i++;printf("%6d  %s\n",i,$0)}'
# 对文件中的所有行编号,但只显示非空白行的行号。
sed '/./=' filename | sed '/./N; s/\n/ /'
awk '{i++;if(!/^$/)printf("%d %s\n",i,$0);else print}'
# 计算行数 (模拟 “wc -l”)
sed -n '$='
awk '{i++}END{print i}'
文本转换和替代:
# Unix环境:转换DOS的新行符(CR/LF)为Unix格式。
sed 's/.$//'                     # 假设所有行以CR/LF结束
sed 's/^M$//'                    # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
sed 's/\x0D$//'                  # ssed、gsed 3.02.80,及更高版本
awk '{sub(/\x0D$/,"");print $0}'
# Unix环境:转换Unix的新行符(LF)为DOS格式。
sed "s/$/`echo -e \\\r`/"        # 在ksh下所使用的命令
sed 's/$'"/`echo \\\r`/"         # 在bash下所使用的命令
sed "s/$/`echo \\\r`/"           # 在zsh下所使用的命令
sed 's/$/\r/'                    # gsed 3.02.80 及更高版本
awk '{printf("%s\r\n",$0)}'
# DOS环境:转换Unix新行符(LF)为DOS格式。
sed "s/$//"                      # 方法 1
sed -n p                         # 方法 2
DOS环境的略过
# DOS环境:转换DOS新行符(CR/LF)为Unix格式。
# 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的
# sed可以通过其特有的“–text”选项。你可以使用帮助选项(“–help”)看
# 其中有无一个“–text”项以此来判断所使用的是否是UnxUtils版本。其它DOS
# 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。
sed "s/\r//" infile >outfile     # UnxUtils sed v4.0.7 或更高版本
tr -d \r outfile        # GNU tr 1.22 或更高版本
DOS环境的略过
# 将每一行前导的“空白字符”(空格,制表符)删除
# 使之左对齐
sed 's/^[ \t]*//'                # 见本文末尾关于'\t'用法的描述
awk '{sub(/^[ \t]+/,"");print $0}'
# 将每一行拖尾的“空白字符”(空格,制表符)删除
sed 's/[ \t]*$//'                # 见本文末尾关于'\t'用法的描述
awk '{sub(/[ \t]+$/,"");print $0}'
# 将每一行中的前导和拖尾的空白字符删除
sed 's/^[ \t]*//;s/[ \t]*$//'
awk '{sub(/^[ \t]+/,"");sub(/[ \t]+$/,"");print $0}'
# 在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
sed 's/^/     /'
awk '{printf("     %s\n",$0)}'
# 以79个字符为宽度,将所有文本右对齐
# 78个字符外加最后的一个空格
sed -e :a -e 's/^.\{1,78\}$/ &/;ta'
awk '{printf("%79s\n",$0)}'
# 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前
# 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充
# 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
sed  -e :a -e 's/^.\{1,77\}$/ & /;ta'                     # 方法1
sed  -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'  # 方法2
awk '{for(i=0;i<39-length($0)/2;i++)printf(" ");printf("%s\n",$0)}'  #相当于上面的方法二
# 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”
sed 's/foo/bar/'                 # 只替换每一行中的第一个“foo”字串
sed 's/foo/bar/4'                # 只替换每一行中的第四个“foo”字串
sed 's/foo/bar/g'                # 将每一行中的所有“foo”都换成“bar”
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo”
sed 's/\(.*\)foo/\1bar/'            # 替换最后一个“foo”
awk '{gsub(/foo/,"bar");print $0}'   # 将每一行中的所有“foo”都换成“bar”
# 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
sed '/baz/s/foo/bar/g'
awk '{if(/baz/)gsub(/foo/,"bar");print $0}'
# 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换
sed '/baz/!s/foo/bar/g'
awk '{if(/baz$/)gsub(/foo/,"bar");print $0}'
# 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'  #对多数的sed都有效
gsed 's/scarlet\|ruby\|puce/red/g'               # 只对GNU sed有效
awk '{gsub(/scarlet|ruby|puce/,"red");print $0}'
# 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。
# 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除
sed '1!G;h;$!d'               # 方法1
sed -n '1!G;h;$p'             # 方法2
awk '{A[i++]=$0}END{for(j=i-1;j>=0;j--)print A[j]}'
# 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”)
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
awk '{for(i=length($0);i>0;i--)printf("%s",substr($0,i,1));printf("\n")}'
# 将每两行连接成一行(类似“paste”)
sed '$!N;s/\n/ /'
awk '{f=!f;if(f)printf("%s",$0);else printf(" %s\n",$0)}'
# 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾
# 并去掉原来行尾的反斜杠
sed -e :a -e '/\\$/N; s/\\\n//; ta'
awk '{if(/\\$/)printf("%s",substr($0,0,length($0)-1));else printf("%s\n",$0)}'
# 如果当前行以等号开头,将当前行并到上一行末尾
# 并以单个空格代替原来行头的“=”
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
awk '{if(/^=/)printf(" %s",substr($0,2));else printf("%s%s",a,$0);a="\n"}END{printf("\n")}'
# 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567”
gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'                     # GNU sed
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'  # 其他sed
#awk的正则没有后向匹配和引用,搞的比较狼狈,呵呵。
awk '{while(match($0,/[0-9][0-9][0-9][0-9]+/)){$0=sprintf("%s,%s",substr($0,0,RSTART+RLENGTH-4),substr($0,RSTART+RLENGTH-3))}print $0}'
# 为带有小数点和负号的数值增加逗号分隔符(GNU sed)
gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
#和上例差不多
awk '{while(match($0,/[^\.0-9][0-9][0-9][0-9][0-9]+/)){$0=sprintf("%s,%s",substr($0,0,RSTART+RLENGTH-4),substr($0,RSTART+RLENGTH-3))}print $0}'
# 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
gsed '0~5G'                      # 只对GNU sed有效
sed 'n;n;n;n;G;'                 # 其他sed
awk '{print $0;i++;if(i==5){printf("\n");i=0}}'
选择性地显示特定行:
# 显示文件中的前10行 (模拟“head”的行为)
sed 10q
awk '{print;if(NR==10)exit}'
# 显示文件中的第一行 (模拟“head -1”命令)
sed q
awk '{print;exit}'
# 显示文件中的最后10行 (模拟“tail”)
sed -e :a -e '$q;N;11,$D;ba'
#用awk干这个有点亏,得全文缓存,对于大文件肯定很慢
awk '{A[NR]=$0}END{for(i=NR-9;i<=NR;i++)print A[i]}'
# 显示文件中的最后2行(模拟“tail -2”命令)
sed '$!N;$!D'
awk '{A[NR]=$0}END{for(i=NR-1;i<=NR;i++)print A[i]}'
# 显示文件中的最后一行(模拟“tail -1”)
sed '$!d'                        # 方法1
sed -n '$p'                      # 方法2
#这个比较好办,只存最后一行了。
awk '{A=$0}END{print A}'
# 显示文件中的倒数第二行
sed -e '$!{h;d;}' -e x              # 当文件中只有一行时,输出空行
sed -e '1{$q;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,显示该行
sed -e '1{$d;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,不输出
#存两行呗(当文件中只有一行时,输出空行)
awk '{B=A;A=$0}END{print B}'
# 只显示匹配正则表达式的行(模拟“grep”)
sed -n '/regexp/p'               # 方法1
sed '/regexp/!d'                 # 方法2
awk '/regexp/{print}'
# 只显示“不”匹配正则表达式的行(模拟“grep -v”)
sed -n '/regexp/!p'              # 方法1,与前面的命令相对应
sed '/regexp/d'                  # 方法2,类似的语法
awk '!/regexp/{print}'
# 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
sed -n '/regexp/{g;1!p;};h'
awk '/regexp/{print A}{A=$0}'
# 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行
sed -n '/regexp/{n;p;}'
awk '{if(A)print;A=0}/regexp/{A=1}'
# 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所在行的行号 (类似“grep -A1 -B1”)
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
awk '{if(F)print;F=0}/regexp/{print NR;print b;print;F=1}{b=$0}'
# 显示包含“AAA”、“BBB”和“CCC”的行(任意次序)
sed '/AAA/!d; /BBB/!d; /CCC/!d'   # 字串的次序不影响结果
awk '{if(match($0,/AAA/) && match($0,/BBB/) && match($0,/CCC/))print}'
# 显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
sed '/AAA.*BBB.*CCC/!d'
awk '{if(match($0,/AAA.*BBB.*CCC/))print}'
# 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”)
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d    # 多数sed
gsed '/AAA\|BBB\|CCC/!d'                        # 对GNU sed有效
awk '/AAA/{print;next}/BBB/{print;next}/CCC/{print}'
awk '/AAA|BBB|CCC/{print}'
# 显示包含“AAA”的段落 (段落间以空行分隔)
# HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
awk 'BEGIN{RS=""}/AAA/{print}'
awk -vRS= '/AAA/{print}'
# 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
awk -vRS= '{if(match($0,/AAA/) && match($0,/BBB/) && match($0,/CCC/))print}'
# 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'         # 只对GNU sed有效
awk -vRS= '/AAA|BBB|CCC/{print "";print}'
# 显示包含65个或以上字符的行
sed -n '/^.\{65\}/p'
cat ll.txt | awk '{if(length($0)>=65)print}'
# 显示包含65个以下字符的行
sed -n '/^.\{65\}/!p'            # 方法1,与上面的脚本相对应
sed '/^.\{65\}/d'                # 方法2,更简便一点的方法
awk '{if(length($0)<=65)print}'
# 显示部分文本——从包含正则表达式的行开始到最后一行结束
sed -n '/regexp/,$p'
awk '/regexp/{F=1}{if(F)print}'
# 显示部分文本——指定行号范围(从第8至第12行,含8和12行)
sed -n '8,12p'                   # 方法1
sed '8,12!d'                     # 方法2
awk '{if(NR>=8 && NR<12)print}'
# 显示第52行
sed -n '52p'                     # 方法1
sed '52!d'                       # 方法2
sed '52q;d'                      # 方法3, 处理大文件时更有效率
awk '{if(NR==52){print;exit}}'
# 从第3行开始,每7行显示一次
gsed -n '3~7p'                   # 只对GNU sed有效
sed -n '3,${p;n;n;n;n;n;n;}'     # 其他sed
awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}'
# 显示两个正则表达式之间的文本(包含)
sed -n '/Iowa/,/Montana/p'       # 区分大小写方式
awk '/Iowa/{F=1}{if(F)print}/Montana/{F=0}'
选择性地删除特定行:
# 显示通篇文档,除了两个正则表达式之间的内容
sed '/Iowa/,/Montana/d'
awk '/Iowa/{F=1}{if(!F)print}/Montana/{F=0}'
# 删除文件中相邻的重复行(模拟“uniq”)
# 只保留重复行中的第一行,其他行删除
sed '$!N; /^\(.*\)\n\1$/!P; D'
awk '{if($0!=B)print;B=$0}'
# 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存大小,或者使用GNU sed。
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'  #bones7456注:我这里此命令并不能正常工作
awk '{if(!($0 in B))print;B[$0]=1}'
# 删除除重复行外的所有行(模拟“uniq -d”)
sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'
awk '{if($0==B && $0!=l){print;l=$0}B=$0}'
# 删除文件中开头的10行
sed '1,10d'
awk '{if(NR>10)print}'
# 删除文件中的最后一行
sed '$d'
#awk在过程中并不知道文件一共有几行,所以只能通篇缓存,大文件可能不适合,下面两个也一样
awk '{B[NR]=$0}END{for(i=0;i<=NR-1;i++)print B[i]}'
# 删除文件中的最后两行
sed 'N;$!P;$!D;$d'
awk '{B[NR]=$0}END{for(i=0;i<=NR-2;i++)print B[i]}'
# 删除文件中的最后10行
sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # 方法1
sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # 方法2
awk '{B[NR]=$0}END{for(i=0;i<=NR-10;i++)print B[i]}'
# 删除8的倍数行
gsed '0~8d'                           # 只对GNU sed有效
sed 'n;n;n;n;n;n;n;d;'                # 其他sed
awk '{if(NR%8!=0)print}' |head
# 删除匹配式样的行
sed '/pattern/d'                      # 删除含pattern的行。当然pattern可以换成任何有效的正则表达式
awk '{if(!match($0,/pattern/))print}'
# 删除文件中的所有空行(与“grep ‘.’ ”效果相同)
sed '/^$/d'                           # 方法1
sed '/./!d'                           # 方法2
awk '{if(!match($0,/^$/))print}'
# 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。
# (模拟“cat -s”)
sed '/./,/^$/!d'        #方法1,删除文件顶部的空行,允许尾部保留一空行
sed '/^$/N;/\n$/D'      #方法2,允许顶部保留一空行,尾部不留空行
awk '{if(!match($0,/^$/)){print;F=1}else{if(F)print;F=0}}'  #同上面的方法2
# 只保留多个相邻空行的前两行。
sed '/^$/N;/\n$/N;//D'
awk '{if(!match($0,/^$/)){print;F=0}else{if(F<2)print;F++}}'
# 删除文件顶部的所有空行
sed '/./,$!d'
awk '{if(F || !match($0,/^$/)){print;F=1}}'
# 删除文件尾部的所有空行
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'  # 对所有sed有效
sed -e :a -e '/^\n*$/N;/\n$/ba'        # 同上,但只对 gsed 3.02.*有效
awk '/^.+$/{for(i=l;i
# 删除每个段落的最后一行
sed -n '/^$/{p;h;};/./{x;/./p;}'
#很长,很ugly,应该有更好的办法
awk -vRS= '{B=$0;l=0;f=1;while(match(B,/\n/)>0){print substr(B,l,RSTART-l-f);l=RSTART;sub(/\n/,"",B);f=0};print ""}'
特殊应用:
# 移除手册页(man page)中的nroff标记。在Unix System V或bash shell下使
# 用’echo’命令时可能需要加上 -e 选项。
sed "s/.`echo \\\b`//g"    # 外层的双括号是必须的(Unix环境)
sed 's/.^H//g'             # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
sed 's/.\x08//g'           # sed 1.5,GNU sed,ssed所使用的十六进制的表示方法
awk '{gsub(/.\x08/,"",$0);print}'
# 提取新闻组或 e-mail 的邮件头
sed '/^$/q'                # 删除第一行空行后的所有内容
awk '{print}/^$/{exit}'
# 提取新闻组或 e-mail 的正文部分
sed '1,/^$/d'              # 删除第一行空行之前的所有内容
awk '{if(F)print}/^$/{F=1}'
# 从邮件头提取“Subject”(标题栏字段),并移除开头的“Subject:”字样
sed '/^Subject: */!d; s///;q'
awk '/^Subject:.*/{print substr($0,10)}/^$/{exit}'
# 从邮件头获得回复地址
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'
#好像是输出第一个Reply-To:开头的行?From是干啥用的?不清楚规则。。
awk '/^Reply-To:.*/{print;exit}/^$/{exit}'
# 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮地址的部分剃除。(见上一脚本)
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'
#取尖括号里的东西吧?
awk -F'[<>]+' '{print $2}'
# 在每一行开头加上一个尖括号和空格(引用信息)
sed 's/^/> /'
awk '{print "> " $0}'
# 将每一行开头处的尖括号和空格删除(解除引用)
sed 's/^> //'
awk '/^> /{print substr($0,3)}'
# 移除大部分的HTML标签(包括跨行标签)
sed -e :a -e 's/<[^>]*>//g;/<[^>]*>/,"",$0);print}'
# 将分成多卷的uuencode文件解码。移除文件头信息,只保留uuencode编码部分。
# 文件必须以特定顺序传给sed。下面第一种版本的脚本可以直接在命令行下输入;
# 第二种版本则可以放入一个带执行权限的shell脚本中。(由Rahul Dhesi的一
# 个脚本修改而来。)
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode   # vers. 1
sed '/^end/,/^begin/d' "$@" | uudecode                    # vers. 2
#我不想装个uudecode验证,大致写个吧
awk '/^end/{F=0}{if(F)print}/^begin/{F=1}' file1 file2 ... fileX
# 将文件中的段落以字母顺序排序。段落间以(一行或多行)空行分隔。GNU sed使用
# 字元“\v”来表示垂直制表符,这里用它来作为换行符的占位符——当然你也可以
# 用其他未在文件中使用的字符来代替它。
sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'
gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'
awk -vRS= '{gsub(/\n/,"\v",$0);print}' ll.txt | sort | awk '{gsub(/\v/,"\n",$0);print;print ""}'
# 分别压缩每个.TXT文件,压缩后删除原来的文件并将压缩后的.ZIP文件
# 命名为与原来相同的名字(只是扩展名不同)。(DOS环境:“dir /b”
# 显示不带路径的文件名)。
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat
DOS 环境再次略过,而且我觉得这里用 bash 的参数 ${i%.TXT}.zip 替换更帅。
下面的一些 SED 说明略过,需要的朋友自行查看原文。
{ Source. Thanks bones7456. }