2008年9月24日星期三

awk - 模式扫描与处理语言

awk - 模式扫描与处理语言

(第二版)

Alfred V. Aho
Brian W. Kernighan
Peter J. Weinberger

Bell Laboratories
Murray Hill, New Jersey 07974

译者声明:译者对译文不做任何担保,译者对译文不拥有任何权利并且不负担任何责任和义务。
原文:http://cm.bell-labs.com/7thEdMan/vol2/awk

摘要

awk 是一门编程语言,它的基本操作是在一组文件上查找模式,并在包含这些模式实例的那些行或字段上进行指定的动作。awk 使得特定数据的选择和变换操作更易于表达;例如,awk 程序

length > 72

打印长度超过 72 个字符的所有输入行;程序

NF % 2 == 0

打印有偶数个字段的所有行;而程序

{ $1 = log($1); print }

把每行的第一个字段替代为它的对数。

awk 模式可以包括正则表达式和在字符串、数值、字段、变量、数组元素上的关系算符的任意的布尔组合。动作可以包括同在模式中一样的模式匹配构造,还有算术和字符串表达式与赋值,if-else、while、for 语句,和多个输出流。

本报告包含用户指南,awk 设计与实现的讨论,和一些计时统计。

September 1, 1978



1. 介绍

awk 是设计用来使很多常见的信息检索和文本操作任务易于陈述和进行的一门编程语言。

awk 的基本操作是依次扫描一组输入文件,查找匹配与用户已经指定的模式集合中的任何一个模式相匹配的行。对于每个模式,都可以指定一个动作;这个动作将在匹配这个模式每一行上进行。

尽管读者熟悉的 UNIX ® 程序 grep 也认可这种方式,在 awk 中的模式可能比 grep 中的模式更加一般性,而且允许的动作比只是打印匹配的行更加复杂。例如,awk 程序

{print $3, $2}

依次打印一个表格的第三和第二列。程序

$2 ~ /A|B|C/

打印在第二列是 A、B 或 C 的所有输入行。程序

$1 != prev { print; prev = $1 }

打印第一个字段不同于前面的第一个字段的所有的行。

1.1. 用法

命令

awk  program  [files]

在指名的一组文件上,或标准输入上、如果没有指定文件的话,执行字符串 program 中的 awk 命令。语句也可以放置到一个文件 pfile 中,并用如下命令执行。

awk  -f pfile  [files]

1.2. 程序结构

awk 程序是如下形式的语句序列:


模式 { 动作 }
模式 { 动作 }
...

输入的每行都要依次针对每个模式做匹配。对于每个匹配的模式,执行相关的动作。在所有模式都已经测试过了的时候,取回下一行并从头开始做匹配。

模式或动作二者都可以但不能同时省略。如果一个模式没有动作,简单的把匹配的行复制到输出。(所以匹配多个模式的行可能被打印多次)。如果一个动作没有模式,则这个动作在所有输入上进行。不匹配模式的行被忽略。

因为模式和动作都是可选的,动作必须被包围在花括号中来区别于模式。

1.3. 记录和字段

awk 输入被分解成了终止于记录分隔符的“记录”。缺省的记录分隔符是换行,所以缺省的 awk 一次处理它的输入中的一行。当前记录的数可在命名为 NR 的变量中得到。

每个输入记录被当作分解成了“字段”。字段通常用空白也就是空格或 tab 来分隔,但是输入字段分隔符是可以变更的,这在后面会有所描述。字段被引用为 $1、$2 ,以此类推。这里的$1 是第一个字段,而 $0 是整个输入记录自身。字段可以被赋值。在当前记录中字段的数目可以在命名为 NF 的变量中得到。

变量 FS 和 RS 分别指定输入字段和记录分隔符;它们可以在任何时候被改变为任何的单一字符。也可以使用可选的命令行参数 −Fc 来设置 FS 为字符 c。

如果记录分隔符为空,把空输入行作为记录分隔符,并把空格、tab 和换行作为字段分隔符处理。

变量 FILENAME 包含当前输入文件的名字。

1.4. 打印

一个动作可以没有模式,在这种情况下动作在所有行上执行。最简单的动作是打印某些或所有的记录;这可以通过 awk 命令 print 来完成。awk 程序

{ print }

打印每个记录,也就是把输入完好的复制到输出。更有用的是打印来自每个记录的一个字段或某些字段。例如

print $2, $1

按逆序打印前两个字段。在 print 语句中用逗号分隔的项,在输出的时候会用当前输出字段分隔符分隔开。没有用逗号分隔的项会串联起来,所以

print $1 $2

把第一个和第二个字段合在一起。

可以使用预定义的变量 NF 和 NR;例如

   { print NR, NF, $0 }

打印出前导了记录数和字段数的每个记录。

输出可以被转向到多个文件中;程序

   { print $1 >"foo1"; print $2 >"foo2" }

写第一个字段 $1 到文件 foo1 中,写第二个字段到文件 foo2 中。还可以使用 >> 符号:

   print $1 >>"foo"

添加输出到文件 foo。(在每种情况下,输出文件都在必要时建立)。文件名可以是一个变量或字段,同常量一样;例如

   print $1 >$2

使用字段 2 的内容作为文件名字。

自然的,有对输出文件数目的限制,目前是 10 个。

类似的,输出可以用管道导入到(只在 UNIX 上的)其他进程;例如,

   print |  "mail bwk"

把输入邮递给 bwk。

可以使用变量 OFS 和 ORS 来改变当前输出字段分隔符和输出记录分隔符。输出记录分隔符被添加到 print 语句的输出后面。

awk 还提供 printf 语句用于输出格式化:

   printf format expr, expr, ...

依据在 format 中的规定格式化在列表中的表达式并打印它们。例如,

   printf "%8.2f  %10ld\n", $1, $2

打印 $1 为 8 位宽的小数点后有两位的浮点数,打印 $2 为 10 位长的长十进制数,并跟随着一个换行。不自动生成输出分隔符;你必须自己增加它们,如这个例子那样。这个版本的printf 同于 C 语言所使用的。


2. 模式

在动作之前的模式充当决定一个动作是否执行的选择者。有多种多样的表达式可以被用做模式: 正则表达式,算术关系表达式,字符串值的表达式,和它们的任意的布尔组合。

2.1. BEGIN 和 END

特殊模式 BEGIN 匹配输入的开始,在第一个记录被读取之前。模式 END 匹配输入的结束,在最后一个记录已经被处理之后。BEGIN 和 END 从而提供了在处理之前和之后获得控制的方式,用来做初始化和总结。

作为一个例子,可以如下这样把字段分隔符设置为冒号

BEGIN { FS = ":" }
... 余下的程序 ...

或如下这样输出输入行的计数

END  { print NR }

如果 BEGIN 出现,它必须是第一模式;END 必须是最后一个模式,如果用到了的话。

2.2. 正则表达式

最简单的正则表达式是包围在斜杠内的文字的字符串,如

/smith/

这实际上是个完整的 awk 程序,它将打印包含名字“smith”的任何出现的所有行。如果一行包含“smith”作为一个大单词的一部分,它也会被打印,比如

blacksmithing

awk 正则表达式包括在 UNIX 文本编辑器 ed 和 grep 中能找到的正则表达式形式(没有后引用)。此外同 lex 一样,awk 允许采用圆括号用做组合,| 用做选择,+ 用做“一或多个”,?用于“零或一个”。字符类可以简写: [a−zA−Z0−9] 是所有字母和数字的集合。作为例子,awk 程序

/[Aa]ho|[Ww]einberger|[Kk]ernighan/

将打印包含名字“Aho”、“Weinberger”或“Kernighan”中任何一个、不论首字母是否大写的所有行。

(带有上述扩展的)正则表达式必须包围在斜杠中,同 ed 和 sed 一样。在正则表达式内,空白和正则表达式元字符是有意义的。要去掉某个正则表达式字符的特殊意义,可前导一个反斜杠。一个例子模式

/\/.*\//

它匹配包围在斜杠内的任何字符串。

你还可以通过算符 ~ 和 !~ 指定任何字段或变量匹配(或不匹配)一个正则表达式。程序

$1 ~ /[jJ]ohn/

打印第一个字段匹配“john”或“John”的所有行。注意它还会匹配“Johnson” 和“St. Johnsbury”等等。要精确的限制它为 [jJ]ohn,使用

$1 ~ /^[jJ]ohn$/

这个脱字符号 ^ 指称一行或一个字段的开始处;美元号 $ 指称结束处。

2.3. 关系表达式

awk 模式可以是涉及常用的关系算符 <、<=、==、!=、>=、> 的关系表达式。 例子

$2 > $1 + 100

它选择第二个字段至少比第一个字段大 100 的行。类似的

NF % 2 == 0

打印有偶数个字段的行。

在关系测试中,如果操作数(operand)都不是数值,则做字符串比较;否则做数值比较。所以

$1 >= "s"

选择开始于 s、t、u 等字符的行。在缺乏任何其他信息的情况下,字段被当作字符串,所以程序

$1 > $2

将进行字符串比较。

2.4. 模式的组合

模式可以是模式的使用算符 ||(或)、&&(与)和 !(非)的任意布尔组合。例如

$1 >= "s" && $1 < "t" && $1 != "smith"

选择第一字段开始于“s”而不是“smith”的行。&& 和 || 保证它们的操作数会被从左至右的求值;在确定了真或假之后求值立即停止。

2.5. 模式范围

选择一个动作的“模式”还可以由用逗号分隔的两个模式组成,比如

pat1,{ ... } pat2

在这种情况下,这个动作在 pat1 的一个出现和 pat2 的下一个出现之间(包含它们)的每个行上进行。例如,

/start/, /stop/

打印在 start 和 stop 之间的所有行。而

NR == 100, NR == 200 { ... }

在输入的从 100 到 200 的行上进行这个动作。


3. 动作

awk 动作是用换行或分号终止的动作语句的序列。这些动作语句可以被用来做各种各样的簿记和字符串操纵任务。

3.1. 内置函数

awk 提供了一个“长度”函数来计算字符串的长度。下面这个程序打印每个记录,每个都前导它的长度:

{print length, $0}

length 自身是个“伪变量”,它生成当前记录的长度;length(参数)生成它的参数的长度,下面的程序等价于上个程序

{print length($0), $0}

参数可以是任何表达式。

awk 还提供算术函数 sqrt、log、exp 和 int,分别得到它们参数的平方根、自然对数、指数和整数部分。

某个内置函数的名字,不带有参数或圆括号,表示这些函数在整个记录上的值。程序

length <> 20

打印长度小于 10 或大于 20 的行。

函数 substr(s, m, n) 生成 s 的开始于位置 m(起始于 1)的最多 n 个字符长的子串。如果省略了 n,子串到达 s 的结束处。函数 index(s1, s2) 返回字符串 s2 在 s1 出现的位置,如果未出现则为零。

函数 sprintf(f, e1, e2, ...) 在 f 指定的 printf 格式中生成表达式 e1、e2 等的值。所以例子

x = sprintf("%8.2f %10ld", $1, $2)

设置 x 为格式化 $1 和 $2 的值所生成的字符串。

3.2. 变量、表达式和赋值

awk 变量依据上下文而被接纳为数值(浮点数)或字符串值。例如

x = 1

x 明显的是个数,而

x = "smith"

明显的是个字符串。在上下文需要的时候,把字符串转换为数或反之。例如

x = "3" + "4"

把 7 赋值给 x。在数值上下文中,不能被解释为数的字符串一般会有为零的数值,但是依靠这种行为是愚蠢的。

缺省的,(不是内置的)变量被初始化为空字符串,它有为零的数值;这消除了大多数对 BEGIN 段落的需要。例如,前两个字段的总和可以用下列程序计算

{ s1 += $1; s2 += $2 }
END { print s1, s2 }

算术在内部以浮点数的方式计算。算术算符有 +、-、*、/、%(模)。C 语言的增加 ++ 和减少 −− 算符也可用,还有赋值算符 +=、-=、*=、/=、%=。这些算符都可以用于表达式中。

3.3. 字段变量

awk 中的字段在本质上享有变量的所有性质 — 他们可以用在算术或字符串运算/操作中,并可以被赋值。所以你可以把第一个字段替代为一个序号,比如:

{ $1 = NR; print }

或累计前两个字段到第三个字段中,比如:

{ $1 = $2 + $3; print $0 }

或把一个字符串赋值到一个字段:

{ if ($3 > 1000)
$3 = "too big"
print
}

它把第三个字段替代为“too big”,在它很长的时候,并在这种情况下,打印这个记录。

字段引用可以是数值表达式,比如

{ print $i, $(i+1), $(i+n) }

一个字段被认为是数值还是字符串依赖于上下文;在有歧义的情况下比如

if ($1 == $2) ...

字段被当作字符串。

每个输入行都在需要的时候被自动分解到字段。还可以把任意变量或字段分解到字段:

n = split(s, array, sep)

把字符串 s 分解到 array[1], ..., array[n]。返回找到的元素数目。如果提供了 sep 参数,则把它用做字段分隔符;否则使用 FS 作为分隔符。

3.4. 字符串连接

字符串可以被串接。例如

length($1 $2 $3)

返回前三个字段的长度。还有在 print 语句中

print $1 " is " $2

打印用“ is ”分隔的两个字段。变量和数值表达式也可以在连接中出现。

3.5. 数组

数组元素不用声明;在被提及到的时候才导致它的存在。下标可以有任何非空的值,包括非数值的字符串。作为常规的数值下标的例子,语句

x[NR] = $0

把当前输入记录赋值到数组 x 的第 NR 个元素。实际上,在原理上(尽管可能很慢)用 awk 程序按随机的次序处理整个输入是可能的

{ x[NR] = $0 }
END {
... 程序 ... }

第一动作只是把每个输入行记录到数组 x 中。

数组元素可以用非数值的值来命名,这给予 awk 非常象 Snobol 语言的关联内存表的能力。假设输入包含的字段带有象 apple、orange 等等这样的值。则程序

/apple/ { x["apple"]++ }
/orange/ { x["orange"]++ }
END { print x["apple"], x["orange"] }

增加指名的数组元素的计数,并在输入结束时打印它们。

3.6. 控制流语句

awk 提供了同 C 语言一样的基本控制流语句 if-else、while、for,和使用花括号的语句组合。我们在章节 3.3 展示了 if 语句而没有描述它。求值在圆括号中的条件;如果为真,则执行在跟随在 if 后面的语句。else 部分是可选的。

while 语句完全同 C 语言的一样。例如,要一行一个打印所有输入字段

i = 1
while (i <= NF) {
print $i
++i
}

for 语句也完全同 C 的一样:

for (i = 1; i <= NF; i++)
print $i

同上面的 while 语句做同样的工作。

for 语句还有一种可选的形式,它适合于访问关联数组的元素:

for (i in array)
语句

把 i 依次设置为 array 的每个元素并重复执行后面的语句。元素是按明显的随机次序访问的。如果在循环期间 i 被改变了,或者访问了新元素,就会出现混乱。

在 if、while、for 的条件部分中的表达式可以包括关系算符如 <、<=、>、>=、==(“等于”)、!=(“不等于”);带有匹配算符 ~ 和 !~ 表示匹配的正则表达式;逻辑算符 ||、&& 和!;当然还有用于组合的圆括号。

break 语句导致从围绕它 while 或 for 中立即退出,continue 语句导致开始下一次重复。

next 语句导致立即跳转到下一个记录并从头开始扫描模式。exit 语句导致程序表现得如同已经到达了输入的结束。

在 awk 程序中可以放置注释: 它们开始于字符 # 并结束于本行的结束处。比如

print x, y # 这是一个注释

4. 设计

UNIX 系统已经提供一些程序,它们通过传递输入经过某种选择机制而进行操作。grep 是最早和最简单的,它只打印匹配一个单一的指定模式的所有行。egrep 提供了更一般的模式,就是说,完全一般性的正则表达式;fgrep 通过特别快的算法查找关键字的集合。

sed 提供了编辑器 ed 的大多数编辑设施,并应用于输入流之上。这些程序都不提供数值功能、逻辑关系或变量。

lex 提供了一般性的正则表达式的识别能力,并充当 C 程序生成器,在能力上是没有限制的。但使用 lex 需要 C 编程的知识,并且 lex 程序必须必须在使用之前编译和装载,所以不鼓励在简短的应用中使用。

awk 尝试填充可能性矩阵中的空白。它提供了一般性的正则表达式能力和隐含的输入/输出循环。它还提供方便的数值处理、变量、更一般性的选择和在动作中的控制流。它不需要编译和 C 语言知识。最后,awk 提供了访问行中字段的方便的方式;在这方面它是唯一的。

awk 还尝试完全整合字符串和数值,通过把所有数量都作为既是字符串又是数处理,尽可能晚的确定哪个表示是合适的。在大多数情况下用户可以简单的忽略这种区别。

开发 awk 的多数努力在于确定 awk 应该做什么与不应该做什么(例如,它不做字符串替换),和应当采用什么语法(没有显式的连接算符),而不是书写和调试代码。我们尝试使语法强力但易于使用并适于扫描文件。例如,缺乏声明和隐含的初始化,尽管对于通用编程语言是个坏主意,但对意图用于甚至是在命令行上合成的小程序的一门语言而言是需要的。

在实践中,awk 的使用适合两个广泛的范畴。其一可以叫做“报表生成”— 处理一个输入,提取计数,总和等。这也包括写琐碎的数据验证程序,比如校验一个字段只包含数值信息或特定分界符是正确配对的。文本和数值处理的组合在这种情况下是没有价值的。

第二个用途是做数据转换器,从一个程序生成的一种形式转换成另一个程序期望的另一种形式。最简单的例子只是选择字段,可能再做些重新安排。


5. 实现

awk 语言的实际实现利用了 UNIX 操作系统上可用的开发工具。文法使用 yacc 规定;词法分析使用 lex;正则表达式识别器是直接从这些表达式构造出来的确定有限自动机。awk 程序被翻译成一个分析树,并接着直接用一个简单的解释器执行它。

awk 是为易于使用而不处理速度而设计;变量类型的延迟评估和分解到字段的需要使在任何情况下都难于达到高速。尽管如此,程序不是慢得不能工作。

下面的表 I 展示了在 PDP-11/70 上 UNIX 程序 wc、grep、egrep、fgrep、sed、lex 和 awk 在下列简单任务上的执行(用户+系统)时间:

  • 1. 计数行数。
  • 2. 打印包含“doug” 的所有行。
  • 3. 打印包含“doug”、 “ken” 或“dmr”的所有行。
  • 4. 打印每行的第三个字段。
  • 5. 依次打印每行的第三和第二个字段。
  • 6. 分别把包含“doug”、“ken”和“dmr”的所有行添加到文件“jdoug”、“jken”和 “jdmr”。
  • 7. 打印每行并前导上“行号 :”。
  • 8. 总和一个表的第四列。

程序 wc 只计数它输入中的字、行和字符;其他的我们都提到过。在所有情况下,输入都是使用命令 ls −l 建立的包含 10,000 行的文件;每行都有如下形式

-rw-rw-rw- 1 ava 123 Oct 15 17:05 xxx

这个输入的总长度是 452,960 个字符。lex 的时间不包括编译和装载。

如同预期的一样,awk 不如特殊工具 wc、sed 或 grep 家族程序那么快,但是比更一般性的工具 lex 要快。在所有情况下,这些任务表达为 awk 程序同表达为其他语言一样容易;涉及字段的任务相当易于表达为 awk 程序。某些测试程序同时用 awk、sed 和 lex 展示。

任务

程序12345878
wc8.6






grep11.713.1





egrep6.211.511.6




fgrep7.713.816.1




sed10.211.615.829.030.516.1

lex65.1150.1144.267.370.3104.081.792.8
awk15.025.629.933.338.946.471.431.1

表 I. 程序的执行时间。(单位是秒)

下面展示完成某些任务的程序。lex 程序一般长得难以展示。

awk:

1. END {print NR}
2. /doug/
3. /ken|doug|dmr/
4. {print $3}
5. {print $3, $2}
6. /ken/ {print >"jken"}
/doug/ {print >"jdoug"}
/dmr/ {print >"jdmr"}
7. {print NR ": " $0}
8. {sum = sum + $4}
END{print sum}

SED:


1. $=
2. /doug/p
3. /doug/p
/doug/d
/ken/p
/ken/d
/dmr/p
/dmr/d
4. /[^ ]* [ ]*[^ ]* [ ]*\([^ ]*\) .*/s//\1/p
5. /[^ ]* [ ]*\([^ ]*\) [ ]*\([^ ]*\) .*/s//\2 \1/p
6. /ken/w jken
/doug/w jdoug
/dmr/w jdmr

LEX:

1. %{
int i;
%}
%%
\n i++;
. ;
%%
yywrap() {
printf("%d\n", i);
}
2. %%
^.*doug.*$ printf("%s\n", yytext);
. ;
\n ;

引用

1. K. Thompson and D. M. Ritchie, UNIX Programmer’s Manual, Bell Laboratories (May 1975). Sixth Edition

2. B. W. Kernighan and D. M. Ritchie, The C Programming Language, Prentice-Hall, Englewood Cliffs, New Jersey (1978).

3. M. E. Lesk, “Lex — A Lexical Analyzer Generator,” Comp. Sci. Tech. Rep. No. 39, Bell Laboratories, Murray Hill, New Jersey (1975).

4. S. C. Johnson, “Yacc — Yet Another Compiler-Compiler,” Comp. Sci. Tech. Rep. No. 32, Bell Laboratories, Murray Hill, New Jersey (July 1975).

rsey (July 1975).

 原文地址 http://cm.bell-labs.com/7thEdMan/vol2/awk

2008年9月8日星期一

人生中少走弯路的10条忠告

1. 买个闹钟,以便按时叫醒你。
  贪睡和不守时,都将成为你工作和事业上的绊脚石,任何时候都一样。不仅要学会准时,更要学会提前。就如你坐车去某地,沿途的风景很美,你忍不住下车看一看,后来虽然你还是赶到了某地,却不是准时到达。“闹钟”只是一种简单的标志和提示,真正灵活、实用的时间,掌握在每个人的心中。

 2. 如果你不喜欢现在的工作,要么辞职不干,要么就闭嘴不言。
  初出茅庐,往往眼高手低,心高气傲,大事做不了,小事不愿做。不要养成挑三拣四的习惯。不要雨天烦打伞,不带伞又怕淋雨,处处表现出不满的情绪。记住,不做则已,要做就要做好。


3. 每个人都有孤独的时候。
 要学会忍受孤独,这样才会成熟起来。年轻人嘻嘻哈哈、打打闹闹惯了,到了一个陌生的环境,面对形形色色的人和事,一下子不知所措起来,有时连一个可以倾心说话的地方也没有。这时,千万别浮躁,学会静心,学会忍受孤独。在孤独中思考,在思考中成熟,在成熟中升华。不要因为寂寞而乱了方寸,而去做无聊无益的事情,白白浪费了宝贵的时间。


4. 走运时要做好倒霉的准备。
  有一天,一只狐狸走到一个葡萄园外,看见里面水灵灵的葡萄垂涎欲滴。可是外面有栅栏挡着,无法进去。于是它一狠心绝食三日,减肥之后,终于钻进葡萄园内饱餐一顿。当它心满意足地想离开葡萄园时,发觉自己吃得太饱,怎么也钻不出栅栏了。相信任何人都不愿做这样的狐狸。退路同样重要。饱带干粮,晴带雨伞,点滴积累,水到渠成。有的东西今天似乎一文不值,但有朝一日也许就会身价百倍。 

5. 不要像玻璃那样脆弱。
  有的人眼睛总盯着自己,所以长不高看不远;总是喜欢怨天尤人,也使别人无比厌烦。没有苦中苦,哪来甜中甜?不要像玻璃那样脆弱,而应像水晶一样透明,太阳一样辉煌,腊梅一样坚强。既然睁开眼睛享受风的清凉,就不要埋怨风中细小的沙粒。

 6. 管住自己的嘴巴。
  不要谈论自己,更不要议论别人。谈论自己往往会自大虚伪,在名不副实中失去自己。议论别人往往陷入鸡毛蒜皮的是非口舌中纠缠不清。每天下班后和你的那些同事朋友喝酒聊天可不是件好事,因为,这中间往往会把议论同事、朋友当做话题。背后议论人总是不好的,尤其是议论别人的短处,这些会降低你的人格。

 7. 机会从不会“失掉”,你失掉了,自有别人会得到。
  不要凡事在天,守株待兔,更不要寄希望于“机会”。机会只不过是相对于充分准备而又善于创造机会的人而言的。也许,你正为失去一个机会而懊悔、埋怨的时候,机会正被你对面那个同样的“倒霉鬼”给抓住了。没有机会,就要创造机会,有了机会,就要巧妙地抓住。

 8. 若电话老是不响,你该打出去。
  很多时候,电话会给你带来意想不到的收获,它不是花瓶,仅仅成为一种摆设。交了新朋友,别忘了老朋友,朋友多了路好走。交际的一大诀窍就是主动。好的人缘好的口碑,往往助你的事业更上一个台阶。

 9. 千万不要因为自己已经到了结婚年龄而草率结婚。
  想结婚,就要找一个能和你心心相印、相辅相携的伴侣。不要因为放纵和游戏而恋爱,不要因为恋爱而影响工作和事业,更不要因一桩草率而失败的婚姻而使人生受阻。感情用事往往会因小失大。

10. 写出你一生要做的事情,把单子放在皮夹里,经常拿出来看。
  人生要有目标,要有计划,要有提醒,要有紧迫感。一个又一个小目标串起来,就成了你一生的大目标。生活富足了,环境改善了,不要忘了皮夹里那张看似薄薄的单子。
 

2008年8月24日星期日

【转载】Niubility 英语教程

昨晚xijing给我发来niubility的时候,一头雾水,后来看到这个文章后,实在感觉很有意思,转过来大家分享!

网上传这么一句话,相当受欢迎:
Many people think they are full of niubility, and like to play zhuangbility, which only reflect their
shability.
可见本国人民对于英语的热忱已经到了相当大的程度,本教程的目的旨在更好地指导大家使用这几个词的用法。
本教程首先对于niubility, zhuangbility, shability这几个词的正确拼写作出以下修改建议:


niubility:正确拼写应为newbility,名词
zhuangbility:正确拼写为drunbility,名词
shability:保持原拼写方式,名词
下面对几个词的词性作一下延展:

drunbility

1、drunbility的词根为drunb,动词,装逼的原意
进行时:drunbing;过去时:drunbed;完成时:have drunbed
例句:BBTV is drubing again during our dinner time, it has drunbed for many years since I have TV.
BBTV又在晚饭时间装逼了,它自从我有电视起就在装逼已经这么多年了。

2、drunbee:名词,装逼的人,有装逼倾向的人
例句:林志玲 is a drunbee, but my father likes her, which is disgusting.
林志玲是个装逼的人,但是偶爸爸喜欢她,真恶心。

3、druber:名词,以装逼为职业的人,专业装逼者
例句:朱军 is a drunber, he has been drunbing all his life, who is professional.
朱军是个职业装逼者,他一辈子都在装逼,是专业级的。

4、drunby:形容词,装逼的
例句:The way you playing music by your mobile phone on a bus is very drunby, not mention the song is 求佛.
你在公交车上用手机放音乐是很装逼的,更别说那歌是求佛。

5、drunblization:名词,装逼化
例句:As more and more Starbucks running in China, the drunblization is getting worse and worse.
随着越来越多的星巴克在中国运营,人民装逼化也越来越严重了。

6、drunblism:名词,装逼主义
例句:The revolution of drublism in France starts in 1863, and people seems respecting that.
法国装逼主义运动起源于1863年,人们貌似很崇拜。

newbility

1、newbility词根为newby,形容词,原意为牛逼
例句:I think the song named 你是我的玫瑰我是你的花 is very newby.
我认为那首你是我的玫瑰我是你的花很牛逼。

比较级:newbier;最高级:newbiest
例句:There is no newbiest, only newbier.
没有最牛逼,只有更牛逼。

2、newber:名词,牛逼的人
例句:王小波 is a newber, and 罗永浩 is also a newber.
王小波是个牛逼的人,罗永浩也是各牛逼的人。

3、newbable:形容词,可以牛逼的,值得牛逼的
例句:I think the cup of 34E is newbable, you should be proud.
我认为34E的罩杯很值得牛逼,你应该自豪。

4、newbilization:名词,牛逼化
例句:The newbilization of white collar is a global problem.
白领牛逼化是个全球性的问题。

shability

1、shability词根为shaby,名词,傻~~~逼
例句:周杰伦 thinks 崔健 is a shaby, which turns out 周 is the real big shaby.
周杰伦认为崔健是傻~~~逼,结果周才是真正的大傻~~~逼。

2、shability,名词,傻~~~逼能力
例句:The power of your shability is as damagable as the earthquake.
你傻~~~逼的能力犹如地震一样具有毁灭性。

3、shabilization,名词,傻~~~逼化
例句:The BBTV news causes the citizen shabilization.
BBTV的新闻导致国民傻~~~逼化。

课后作业:
一、翻译句子
1、日本的傻~~~逼化进程已经完成,傻~~~逼比例与傻~~~逼能力均是世界第一的。
2、姜文的电影很牛逼,他是一个牛逼的人,希望中国电影都能牛逼化。
3、广电总局是个傻~~~逼的机构,但总认为自己是最牛逼的。
4、装逼难,做一个装逼人更难,做一个职业装逼者难上加难,但是朱军做到了。

二、单词填空(运用所有上文出现过的单词)
1、The wirter of this tutorial is very ___________.
2、The picture of 陈冠希 and 阿娇 in bed is totally ________________.
3、芙蓉姐姐 is a symbol of __________, and she is a ________.

三、发散思维练习(供学有余力的同学选做)
扩展erbility,nengbility,lanbility,qiongbility等词汇

2008年8月11日星期一

NBC版本的开幕式

搬起指头来数,都已经不知道这个暑假在学校呆了多久了。8号那天,我特地赶回家,为了看这场开幕式。结果,差点没让我睡着。虽然这次在创意上和部分的画面上,让我小小的赞叹了一下,但整场的效果,...毕竟对这样一场开幕式,任何一个中国人都期待的太多。
看到谷歌的搜索趋势上,很多人都在搜素NBC版的开幕式。顺着一个一个的链接,我找到部分的片段,真如很多网友评论的那样:你看了NBC版本的,你就发觉8号晚上你没有看开幕式。不论是从画面色彩还是镜头的切换角度,都能给电视机前的观众带来浪漫的气息,以及震撼的视觉冲击!想起了专业课上,我们小组拍的那些小短片,同样的视频素材,不同人的后期编辑,哪怕只是镜头的先后进入,成品的效果那可大不相同。(这就说明了BOB直播和NBC版本差别的原因)

奥运开幕式各国采用的通常是以Bob公司的直播视频为蓝本,加上一些对本国运动队和领导人的镜头,但美国NBC电视台采用的是后期录播,因此就没有Bob直播室的诸多问题,如应该远景,而出近景,导致视觉效果不好的重大问题。这是一个值得观看的版本!

看到网上很多人都到处在找NBC版本的开幕式视频,这里我公布一个它的BT种子。4.92G的视频,需要提醒的是,下载下来完全没有问题,因为视频被压缩软件切割成了若干小段,但是解压的时候,需要你的硬盘分区是NTFS的格式。(因为FAT32最大支持4G的文件)。

这里还讲个小插曲,幸好有教育科研网的帮助--这种牛x的下载速度--才能让我有信心找到这样宝贵的视频。网上大部分的电驴链接1.02G的avi视频实际上是阉割的版本,大部分国家的选手进场没有记录在里面。另外有一些BT链接,是2.54G的是BBC版本的开幕式视频。前后算了一下,我今天下了将近10几G的视频文件。为硬盘默哀ing...

哦,大家最关心的应该是NBC版本的开幕式视频种子,点击这里下载。另还有一个Full HD 1440X1080i版本的,本人贴出来,如果你有需要的话,可以留言留下你的email地址。上述两个视频,收藏是最合适不过的了。

下面开始是开幕式的贴图时间,NBC版本的视频截图



没有想到昨晚发贴,今天会有这么多人跟帖要种,继续昨晚的受宠若惊。有一点不得不说明的是720p的那个版本已经可以满足绝大多数的视觉需求了。而Full HD的版本,本人没有亲自测试内容,所以最开始没有在这里给出链接。但从清晰度来讲,肯定要比前者要好得多。但是同时也带来了3个问题:1. 大多数家用宽带是adsl,被限速为1M~4M。这样的速度去下载高达9G的视频,很辛苦;2.这样高清的视频,对机器的配置也会有一点的要求,而不见得 您的机器就看得流畅;3.保存起来也不会那么方便。普通的DVD碟储存上限是4.7G(事实上,往往没有达到),而DVD9的也才8.5G,故需要刻碟保 存的话,后者也需要进行再次压缩。综合各方面原因,本人最先开始没有给出Full HD版本的种子。

鉴于大家如此的热情,我直接在这里给出下载链接,大家可以不用在贴自己的邮箱了。我的邮箱服务商说我今天一天内发的邮件太多,每封信发出去都要填写验证码了。所以,我就不一一回复了。谢谢大家的支持。

Full HD 1440X1080i点击下载
FullHD 1080i (1440X1080i)
Video= MPEG-TS - H264 - 5500Kbps
Audio= AAC St??r??o (french)
Need to use a deinterlace filter and a 16/9 ratio.
这个版本不是NBC版本,
而是法国某电视台的录制信息,从截图看,确实很清晰。网友提供的奥运会开幕式的部分截图。

-----------------------------------------------------------------
720p.HDTV.x264 点击下载
Codec : MPEG-4 AVC
Format : Mkv
Width : 1280 pixels
Height : 720 pixels
Display Aspect ratio : 16/9
Frame rate : 29.970 fps
Language : English
Audio #1
Codec/Info : Dolby AC3
Channel(s) : 6 channels
Sampling rate : 48 KHz
这个版本是目前最多看,最多人想要的NBC版本,下他准没有错。
另,NBC在线观看地址

-----------------------------------------------------------------
TVB-Jade HD 1080i version MPEG2 50FPS 点击下载
Total File Size : 42.34GB
Format : .ts
Spoken language : Chinese
Texted language : Chinese
根据一些追求高清朋友的要求,这里推出42G的超豪华版本。传说中的TVB出品

萝卜白菜,各有所爱。大家就各取所需吧。

2008年8月3日星期日

过去,未来

这么多年,只因为当年一时冲动,选择了一条不归之路,真的是不知道是幸运,还是不幸。上次恋爱因为一些事,前女友因为不能接受me工作的性质,离我远去。难道是上天注定要玩弄我,现在思维混乱,不知道怎么去告诉她,告诉她一切,可是。。。我怎么做到底怎么做才对,上天,你教我怎么做嘛,让我一辈子就这样嘛。我不愿意,不想。。。。不要和我说话,我的精神压力好大。谁又能理解。。。。到底谁能理解。。。。

2008年7月17日星期四

面朝大海 春暖花开

written by 海子

从明天起,做一个幸福的人

喂马,劈柴,周游世界

从明天起,关心粮食和蔬菜

我有一所房子,面朝大海,春暖花开



从明天起,和每一个亲人通信

告诉他们我的幸福

那幸福的闪电告诉我的

我将告诉每一个人



给每一条河每一座山取一个温暖的名字

陌生人,我也为你祝福

愿你有一个灿烂的前程

愿你有情人终成眷属

愿你在尘世获得幸福

我只愿面朝大海,春暖花开



I wanna be a happiness man from tomorrow

feeding hourses,hewing brushwoods,and travelling the world

I'm gonna care about the food and vegetables from tomorrow

I have a house,facing the sea,blowing in the warm spring



I'm gonna contact with every relation from tomorrow

tell them my happiness

which the lightning of happiness told me

i would tell each one



I would give a warm name for every river and mountain

Strangers, i would bless for you

May you have a golden future

May you feel emotion the person fianlly to become the famliy member

May you gain the happiness in this world

I just wanna face the sea and blow in the warm spring

2008年7月3日星期四

用Firefox免费看花花公子杂志

用Firefox免费看花花公子杂志
Zinio网站分享出许多著名杂志的电子版,主要提供给iPhone和iPod Touch的使用者,杂志覆盖电脑、汽车、相机、服装、健康、实事、美食等方面。进入时会要求你输入电子邮件地址,以通知你未来杂志的更新。

对于没有这类电子设备的我们如何享受这样的好处呢?只要修改浏览器的User Agent就可以办到,让网页以为你是美国的iPhone用户。

用Firefox 2或3、Safari和Maxthon等就可以轻松自定义User Agent。但建议你用Firefox 3,因为Firefox 3效果更强大,甚至比iPhone上Mobile Safari的哥哥Safari 3还有厉害,Firefox 3可以整个版面一起放大让文字看得更清楚。

Firefox

在Firefox的网址栏输入:about:config,利用鼠标右键,点击“新建——字符串”,填入:general.useragent.override。

然后填入该字符串的值:Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/419 (United States)

接着,访问 http://www.zinio.com/iphone ,就可以免费读杂志了!

但这个general.useragent.override设置基本上会对一些网站有影响,而导致无法浏览,如微软Live Space。这时,只要在about:config的页面上找到general.useragent.override这项,鼠标右键点击“重设”,这样Firefox就恢复到原来的状态了。

原文中还有Maxthon和Safari中的方法:http://publish.it168.com/2008/0612/20080612004001.shtml