纯真IP数据库格式详解 zt

0

纯真IP数据库格式详解 zt

= LumaQQ 开发者文档====================

纯真IP数据库格式详解

摘要

网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础。不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其内幕,不过那份文档寥寥数语,也是颇为耐心才读明白。在这里我重写一份,以此做为LumaQQ开发者文档的一部分,我想还是必要的。本文详细介绍了纯真IP数据库的格式,并且给出了一些Demo以供参考。
Luma, 清华大学
修改日期: 2005/01/14

Note: 在此感谢纯真IP数据库作者金狐和那唯一一份文档的作者。

修改历史:
2005-01-14 修改了原来一些表达不清和错误的地方

——————————————————————————–

自从有了IP数据库这种东西,QQ外挂的显示IP功能也随之而生,本人见识颇窄,是否还有其他应用不得而知,不过,IP数据库确实是个不错的东西。如今网络上最流行的IP数据库我想应该是纯真版的(说错了也不要扁我),迄今为止其IP记录条数已经接近30000,对于有些IP甚至能精确到楼层,不亦快哉。 2004年4、5月间,正逢LumaQQ破土动工,为了加上这个人人都喜欢,但是好像人人都不知道为什么喜欢的显IP功能,我也采用了纯真版IP数据库,它的优点是记录多,查询速度快,它只用一个文件QQWry.dat就包含了所有记录,方便嵌入到其他程序中,也方便升级。

基本结构
QQWry.dat文件在结构上分为3块:文件头,记录区,索引区。一般我们要查找IP时,先在索引区查找记录偏移,然后再到记录区读出信息。由于记录区的记录是不定长的,所以直接在记录区中搜索是不可能的。由于记录数比较多,如果我们遍历索引区也会是有点慢的,一般来说,我们可以用二分查找法搜索索引区,其速度比遍历索引区快若干数量级。图1是QQWry.dat的文件结构图。


图1. QQWry.dat文件结构
要注意的是,QQWry.dat里面全部采用了little-endian字节序

一. 了解文件头
QQWry.dat的文件头只有8个字节,其结构非常简单,首四个字节是第一条索引的绝对偏移,后四个字节是最后一条索引的绝对偏移。

二. 了解记录区
每条IP记录都由国家和地区名组成,国家地区在这里并不是太确切,因为可能会查出来“清华大学计算机系”之类的,这里清华大学就成了国家名了,所以这个国家地区名和IP数据库制作的时候有关系。所以记录的格式有点像QName,有一个全局部分和局部部分组成,我们这里还是沿用国家名和地区名的说法。

于是我们想象着一条记录的格式应该是: [IP地址][国家名][地区名],当然,这个没有什么问题,但是这只是最简单的情况。很显然,国家名和地区名可能会有很多的重复,如果每条记录都保存一个完整的名称拷贝是非常不理想的,所以我们就需要重定向以节省空间。所以为了得到一个国家名或者地区名,我们就有了两个可能:第一就是直接的字符串表示的国家名,第二就是一个4字节的结构,第一个字节表明了重定向的模式,后面3个字节是国家名或者地区名的实际偏移位置。对于国家名来说,情况还可能更复杂些,因为这样的重定向最多可能有两次。

那么什么是重定向模式?根据上面所说,一条记录的格式是[IP地址][国家记录][地区记录],如果国家记录是重定向的话,那么地区记录是有可能没有的,于是就有了两种情况,我管他叫做模式1和模式2。我们对这些格式的情况举图说明:


图2. IP记录的最简单形式
图2表示了最简单的IP记录格式,我想没有什么可以解释的


图3. 重定向模式1
图3演示了重定向模式1的情况。我们看到在模式1的情况下,地区记录也跟着国家记录走了,在IP地址之后只剩下了国家记录的4字节,后面3个字节构成了一个指针,指向了实际的国家名,然后又跟着地址名。模式1的标识字节是0×01。


图4. 重定向模式2
图4演示了重定向模式2的情况。我们看到了在模式2的情况下(其标识字节是0×02),地区记录没有跟着国家记录走,因此在国家记录之后4个字节之后还是有地区记录。我想你已经明白了模式1和模式2的区别,即:模式1的国家记录后面不会再有地区记录,模式2的国家记录后会有地区记录。下面我们来看一下更复杂的情况。


图5. 混和情况1
图5演示了当国家记录为模式1的时候可能出现的更复杂情况,在这种情况下,重定向指向的位置仍然是个重定向,不过第二次重定向为模式2。大家不用担心,没有模式3了,这个重定向也最多只有两次,并且如果发生了第二次重定向,则其一定为模式2,而且这种情况只会发生在国家记录上,对于地区记录,模式1和模式 2是一样的,地区记录也不会发生2次重定向。不过,这个图还可以更复杂,如图7:


图6. 混和情况2
图6是模式1下最复杂的混和情况,不过我想应该也很好理解,只不过地区记录也来重定向而已,有一点我要提醒你,如果重定向的地址是0,则表示未知的地区名。

所以我们总结如下:一条IP记录由[IP地址][国家记录][地区记录]组成,对于国家记录,可以有三种表示方式:字符串形式,重定向模式1和重定向模式 2。对于地区记录,可以有两种表示方式:字符串形式和重定向,另外有一条规则:重定向模式1的国家记录后不能跟地区记录。按照这个总结,在这些方式中合理组合,就构成了IP记录的所有可能情况。

设计的理由
在我们继续去了解索引区的结构之前,我们先来了解一下为何记录区的结构要如此设计。我想你可能想到了答案:字符串重用。没错,在这种结构下,对于一个国家名和地区名,我只需要保存其一次就可以了。我们举例说明,为了表示方便,我们用小写字母代表IP记录,C表示国家名,A表示地区名:

有两条记录a(C1, A1), b(C2, A2),如果C1 = C2, A1 = A2,那么我们就可以使用图3显示的结构来实现重用
有三条记录a(C1, A1), b(C2, A2), c(C3, A3),如果C1 = C2, A2 = A3,现在我们想存储记录b,那么我们可以用图6的结构来实现重用
有两条记录a(C1, A1), b(C2, A2),如果C1 = C2,现在我们想存储记录b,那么我们可以采用模式2表示C2,用字符串表示A2

你可以举出更多的情况,你也会发现在这种结构下,不同的
字符串只需要存储一次。

了解索引区
在”了解文件头”部分,我们说明了文件头实际上是两个指针,分别指向了第一条索引和最后一条索引的绝对偏移。如图8所示:


图8. 文件头指向索引区图示
实在是很简单,不是吗?从文件头你就可以定位到索引区,然后你就可以开始搜索IP了!每条索引长度为7个字节,前4个字节是起始IP地址,后三个字节就指向了IP记录。这里有些概念需要说明一下,什么是起始IP,那么有没有结束IP? 假设有这么一条记录:166.111.0.0 – 166.111.255.255,那么166.111.0.0就是起始IP,166.111.255.255就是结束IP,结束IP就是IP记录中的那头 4个字节,这下你应该就清楚了吧。于是乎,每条索引配合一条记录,构成了一个IP范围,如果你要查找166.111.138.138所在的位置,你就会发现166.111.138.138落在了166.111.0.0 – 166.111.255.255 这个范围内,那么你就可以顺着这条索引去读取国家和地区名了。那么我们给出一个最详细的图解吧:


图9. 文件详细结构
现在一切都清楚了是不是?也许还有一点你不清楚,QQWry.dat的版本信息存在哪里呢?答案是:最后一条IP记录实际上就是版本信息,最后一条记录显示出来就是这样:255.255.255.0 255.255.255.255 纯真网络 2004年6月25日IP数据。OK,到现在你应该全部清楚了。

原文地址 http://bbs.sei.ynu.edu.cn/viewthread.php?tid=9974

网上邻居可见,无法访问,您可能没有权限使用网络资源

0

XP网络不能访问的解决方案

1.就是像2000一样“开启guset用户”

2.允许Guest用户访问本机 :开始–运行–输入gpedit.msc,依次选择“计算机配置→Windows设置→安全设置→本地策略→用户权利指派”,删除“拒绝从网络访问这台计算机”策略中的“GUEST”账号。

3.更改网络访问模式:开始–运行–输入gpedit.msc,依次选择“计算机配置→Windows设置→安全设置→本地策略→安全选项”,双击“ 网络访问:本地账号的共享和安全模式”策略,将“仅来宾—本地用户以来宾身份验证”改为“经典:本地用户以自己的身份验证”。

4.解除空口令限制:在系统“安全选项”中停用“账户:使用空白密码的本地账户只允许进行控制台登录”策略。

5.网络邻居看不到计算机:打开“控制面板→性能和维护→管理工具→服务”,启动里面的“Computer Browser”服务。

6.增加共享文件权限选项:依次打开“我的电脑→工具→文件夹属性→查看→高级设置”,将“简单文件共享(推荐)”前面的选择取消,若还有“Mickey Mouse”项也将其取消。

7.网络邻居不响应或者反应慢:关掉WinXP的计划任务服务(Task Scheduler) 到“控制面板/管理工具/服务”中打开“Task Scheduler”的属性对话框,停止该服务,再将启动类型设为“手动”。

8.到“工具/文件夹选项”中,关闭自动搜索的网络文件夹和打印机。

XP网络不能访问的解决方案(详细版本)

1.检查guest账户是否开启

XP默认情况下不开启guest账户,因此些为了其他人能浏览你的计算机,请启用guest账户。同时,为了安全请为guest设置密码或相应的权限。当然,也可以为每一台机器设置一个用户名和密码以便计算机之间的互相访问。

2.检查是否拒绝Guest用户从网络访问本机

当你开启了guest账户却还是根本不能访问时,请检查设置是否为拒绝guest从网络访问计算机,因为XP默认是不允许guest从网络登录的,所以即使开了guest也一样不能访问。在开启了系统Guest用户的情况下解除对Guest账号的限制,点击“开始→运行”,在“运行”对话框中输入 “GPEDIT.MSC”,打开组策略编辑器,依次选择“计算机配置→Windows设置→安全设置→本地策略→用户权利指派”,双击“拒绝从网络访问这台计算机”策略,删除里面的“GUEST”账号。这样其他用户就能够用Guest账号通过网络访问使用Windows XP系统的计算机了。

3.改网络访问模式

XP默认是把从网络登录的所有用户都按来宾账户处理的,因此即使管理员从网络登录也只具有来宾的权限,若遇到不能访问的情况,请尝试更改网络的访问模式。打开组策略编辑器,依次选择“计算机配置→Windows设置→安全设置→本地策略→安全选项”,双击“网络访问:本地账号的共享和安全模式”策略,将默认设置“仅来宾—本地用户以来宾身份验证”,更改为“经典:本地用户以自己的身份验证”。

这样即使不开启guest,你也可以通过输入本地的账户和密码来登录你要访问的计算机,本地的账户和密码为你要访问的计算机内已经的账户和密码。若访问网络时需要账户和密码,可以通过输入你要访问的计算机内已经的账户和密码来登录。
若不对访问模式进行更改,也许你连输入用户名和密码都办不到,//computername/guest为灰色不可用。即使密码为空,在不开启guest 的情况下,你也不可能点确定登录。改成经典模式,最低限度可以达到像2000里没有开启guest账户情况时一样,可以输入用户名和密码来登录你要进入的计算机。也许你还会遇到一种特殊的情况,请看接下来的。

4.一个值得注意的问题

我们可能还会遇到另外一个问题,即当用户的口令为空时,即使你做了上述的所有的更改还是不能进行登录,访问还是会被拒绝。这是因为,在系统“安全选项”中有“账户:使用空白密码的本地账户只允许进行控制台登录”策略默认是启用的,根据Windows XP安全策略中拒绝优先的原则,密码为空的用户通过网络访问使用Windows XP的计算机时便会被禁止。我们只要将这个策略停用即可解决问题。在安全选项中,找到“使用空白密码的本地账户只允许进行控制台登录”项,停用就可以,否则即使开了guest并改成经典模式还是不能登录。经过以上的更改基本就可以访问了。

5.网络邻居不能看到计算机

可能经常不能在网络邻居中看到你要访问的计算机,除非你知道计算机的名字或者IP地址,通过搜索或者直接输入//computername或//IP。请按下面的操作解决:启动“计算机浏览器”服务。“计算机浏览器服务”在网络上维护一个计算机更新列表,并将此列表提供给指定为浏览器的计算机。如果停止了此服务,则既不更新也不维护该列表。

137/UDP–NetBIOS名称服务器,网络基本输入/输出系统(NetBIOS)名称服务器(NBNS)协议是TCP/IP上的NetBIOS(NetBT)协议族的一部分,它在基于NetBIOS名称访问的网络上提供主机名和地址映射方法。

138/UDP–NetBIOS数据报,NetBIOS数据报是TCP/IP上的NetBIOS(NetBT)协议族的一部分,它用于网络登录和浏览。

139/TCP–NetBIOS会话服务,NetBIOS会话服务是TCP/IP上的NetBIOS(NetBT)协议族的一部分,它用于服务器消息块(SMB)、文件共享和打印。请设置防火墙开启相应的端口。一般只要在防火墙中允许文件夹和打印机共享服务就可以了。

6.关于共享模式

对共享XP默认只给予来宾权限或选择允许用户更改“我的文件”。Windows 2000操作系统中用户在设置文件夹的共享属性时操作非常简便,只需用鼠标右击该文件夹并选择属性,就可以看到共享设置标签。而在Windows XP系统设置文件夹共享时则比较复杂,用户无法通过上述操作看到共享设置标签。具体的修改方法如下:打开“我的电脑”中的“工具”,选择“文件夹属性”,调出“查看”标签,在“高级设置”部分滚动至最底部将“简单文件共享(推荐)”前面的选择取消,另外如果选项栏里还有“Mickey Mouse”项也将其选择取消。这样修改后用户就可以象使用Windows 2000一样对文件夹属性进行方便修改了。

7.关于用网络邻居访问不响应或者反应慢的问题

在WinXP和Win2000中浏览网上邻居时系统默认会延迟30秒,Windows将使用这段时间去搜寻远程计算机是否有指定的计划任务(甚至有可能到 Internet中搜寻)。如果搜寻时网络时没有反应便会陷入无限制的等待,那么10多分钟的延迟甚至报错就不足为奇了。下面是具体的解决方法。

A.关掉WinXP的计划任务服务(Task Scheduler)

可以到“控制面板/管理工具/服务”中打开“Task Scheduler”的属性对话框,单击“停止”按钮停止该项服务,再将启动类型设为“手动”,这样下次启动时便不会自动启动该项服务了。

B.删除注册表中的两个子键

到注册表中找到主键“HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerRemoteComputerNameSpace”

删除下面的两个子健:{2227A280-3AEA-1069-A2DE-08002B30309D}和{D6277990-4C6A-11CF-87-00AA0060F5BF}。

其中,第一个子健决定网上邻居是否要搜索网上的打印机(甚至要到Internet中去搜寻),如果网络中没有共享的打印机便可删除此键。第二
个子健则决定是否需要查找指定的计划任务,这是网上邻居很慢的罪魁祸首,必须将此子健删除。

在Linux Shell下将汉字转换为Url编码

1

  在linux 的shell环境下有一个od命令可以将文件按不同的进制的ascii码输出,该功能可以完成在linux shell下将汉字转换为url编码的任务。

  url编码是十六进制的形如%E6%9C%8D%E5%8A%A1%E5的字符串,test是包含“数据库网络,”这几个字符的文件,以下命令输出:

#od -t x /test
0000000 ddbefdca f8cde2bf 0a2ce7c2
0000014

  该字符串对应的url编码为 %CA%FD%BE%DD%BF%E2%CD%F8%C2%E7%2C。

  可以看出编码的对应关系以下是转换的脚本:

#!/bin/sh
#make url code
od -t x /test |awk '{
w=split($0,linedata," ");
for (j=2;j<w+1;j++)
{
for (i=7;i>0;i=i-2)
{
if (substr(linedata[j],i,2) != "00") {printf "%" ;printf toupper(substr(linedata[j],i,2));}
}
}
}' >/testurl

  testurl文件的内容就是转换结果。

还原编码:

echo '%CA%FD%BE%DD%BF%E2%CD%F8%C2%E7%2C'|
awk 'BEGIN {
for (i=0;i<=16;i++) hex[sprintf("%X",i)]=i;}
{ for (i=1;i<=length($0);i++)
  { c=substr($0,i,1)
    if (c=="+") printf (" ");
    else if (c=="%") {
     printf ("%c",hex[substr($0,++i,1)]*16+hex[substr($0,++i,1)])
                     
                      }
    else  printf (c);

   }
} '
数据库网络

Pidgin(Gaim)登录QQ显示NULL问题的完全解决方法!

1

使用起了Pidgin(前身Gaim),很不错的聊天软件呢,常见的QQ,MSN,Yahoo,GTalk,AIM都能集成登录。我经 常就是开着QQ和MSN(在同一版面显示,截个图先~)

说重点,截图中显示的当然是已经解决“NULL”无法显示好友以及群名称的问题。具体解决办法,首先完全卸载旧版本的Pidgin(低于2.42版的),然后安装最新版的Pidgin软件,保持GTK+和Pidgin的版本最新。最新版下载地址:http://www.pidgincn.com/download.php   点击下载Pidgin(Gaim) 2.4.2 windows版 就行了。(已为最新版的,就免了这步了。)忘了说了,这里的NULL解决方法只是针对Windows平台的解决方法,Linux的暂不知道。

第二步,也是最后一步,下载由Gaim官方论坛trublemaker 提供的自己编译的QQ插件:下载地址:qq-null-pidgin.zip。(本站流量小,请勿盗链。)解压里面出libqq.dll这个文件复制到pidgin安装目录的plugins文件夹下,可以先备份原QQ插件libqq.dll。然后再复制。(做这一步的时候请勿使用Pidgin,以免出问题。)最后清理下系统缓存,垃圾文件之类的东西就OK了。

(网上有关于修改注册表的、也有改系统设置项的或GTK+设置的方法,效果都不是让人满意,仅能解决好友NULL乱码,不能解决群的故障。)

windows更新补丁失败的解决办法

0

要在 Windows 中注册 Wups2.dll 文件,请按照下列步骤操作:

1.停止自动更新服务

net stop wuauserv

2.注册 Wups2.dll 文件

regsvr32 c:windowssystem32wups2.dll

3.启动自动更新服务

net start wuauserv

用 Synergy 控制多台电脑

0

Synergy 的确是一个不可思议的软件。

Synergy 可以算作一款远程控制软件。一般的远程控制软件都是将服务器的画面提供给客户端使用,而Synergy的创意很独特,它将客户端的键盘和鼠标提供给服务器使用。这样如果你有多台电脑并且每台电脑都有自己的显示器,你可以通过 Synergy 用一组键盘和鼠标控制所有电脑,而且每台电脑的屏幕可以连接起来,就像在同一台电脑上使用多个显示器一样。下面介绍一下使用方法,所用版本为 1.3.1。

假设我们有三台电脑,分别为 computerAcomputerBcomputerC。我们要使用 computerA 的鼠标键盘控制这三台电脑,并且屏幕的布局如下。

服务器设置

首先在 computerA 上启动 Synergy,选择 Share this computer’s keyboard and mouse (server)

然后单击下面的Configure…按钮,以配置各个屏幕。单击 Screens 下面的 + 按钮,输入 Screen Name 为 computerA,确定。同样的方法依次添加 computerB 和 computerC。

然后我们要设置这三个屏幕的布局。在 Links 的列表框下方有一排输入框和选择框,将其依次设置为以下的内容然后单击下方的 + 按钮。

  • 0 to 100% of the left of computerA goes to 0 to 100% of computerB
  • 0 to 100% of the right of computerB goes to 0 to 100% of computerA
  • 0 to 100% of the left of computerC goes to 0 to 100% of computerA
  • 0 to 100% of the right of computerA goes to 0 to 100% of computerC

这样我们就将三个屏幕设置为 B – A – C 的布局了。注意两个屏幕之间的连接是双向的,比如我们设置了 B <- A,也要同时设置 B -> A,否则鼠标从 A 移动到 B 之后就无法回到 A 了。最终的结果如下。

回到主界面,单击 Advanced… 按钮,确认Screen Name的内容为 computerA,确定。

至此服务器端设置完毕,先不要关闭 Synergy 的对话框。

客户端设置

在 computerB 上启动 Synergy,选择Use another computer’s shared keybord and mouse(client),并在下面的主机名处填写 computerA。

然后单击 Advanced… 按钮,确认Screen Name的内容为 computerB。

在 computerC 上用同样的方法进行设置。

测试

在 computerA 上单击 Test 按钮,然后依次在 computerB 和 computerC 上单击 Test 按钮。我们试着在 computerA 上将鼠标移动到屏幕左侧,就会看到鼠标移动到了 computerB 上,而此时键盘也在控制 computerB;然后将鼠标移动到 computerB 屏幕右侧,鼠标就会回到 computerA;再将鼠标移动到 computerA 右侧,鼠标就会移动到 computerC 上。

启动

最后依次在每台电脑上单击 AutoStart… 按钮,选择登录时自动启动或者电脑启动时自动启动 Synergy,单击Install按钮。最后回到主界面,单击 Start 按钮关闭 Synergy 设置窗口即可。

deb安装包的安装方法

0

deb 是debian linus 的安装格式,跟red hat 的rpm相似
安装: sudo dpkg -i file.deb
反安装:sudo dpkg -r package_name

不过要安装dpkg的package,也可用alien这类软件将package转为rpm等格式,或直接下个rpm 或tar包。
关于deb包转换成rpm的方法:
sudo apt-get install alien #alien默认没有安装,所以首先要安装它。

sudo alien xxxx.rpm #将rpm转换位deb,完成后会生成一个同名的xxxx.deb。

sudo dpkg -i xxxx.deb #安装。

哆啦A梦之COSPLAY版

0

在网上看到的,和大家分享一下。更多图片在作者博客:熊猫盒子

Can’t connect to local MySQL server through socket 解决办法

0

启动mysql 报错:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

1、先查看 /etc/rc.d/init.d/mysqld status 看看m y s q l 是否已经启动.
另外看看是不是权限问题.

2、确定你的mysql.sock是不是在那个位置,
mysql -u 你的mysql用户名 -p -S /var/lib/mysql/mysql.sock

3、试试:service mysqld start

4、如果是权限问题,则先改变权限 #chown -R mysql:mysql /var/lib/mysql

[root@localhost ~]# /etc/init.d/mysqld start
启动 MySQL: [ 确定 ]
[root@localhost ~]# mysql -uroot -p

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
原因是,/var/lib/mysql 的访问权限问题。

shell> chown -R mysql:mysql /var/lib/mysql

接着启动服务器

shell> /etc/init.d/mysql start

服务器正常启动后察看 /var/lib/mysql 自动生成mysql.sock文件。

但是我的问题仍然没有得到解决。

问题终于解决:
方法: 修改/etc/my.conf:
[mysqld]
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock

[mysql.server]
user=mysql
basedir=/usr/local/mysql

If there is not currently a section called [client], add one at the bottom of the file and copy the socket= line under the [mysqld] section such as:

[client]
socket=/var/lib/mysql/mysql.sock

发现依旧如此,运行/etc/init.d/mysql start报错: Starting MySQLCouldn’t find MySQL manager or server
是mysqld服务没启,运行/usr/local/mysql/bin/mysqld_safe &

问题解决。

awk常用函数以及变量参考

0

1.awk的常规表达式元字符
换码序列
^ 在字符串的开头开始匹配
$ 在字符串的结尾开始匹配
. 与任何单个字符串匹配
[ABC] 与[]内的任一字符匹配
[A-Ca-c] 与A-C及a-c范围内的字符匹配(按字母表顺序)
[^ABC] 与除[]内的所有字符以外的任一字符匹配
Desk|Chair 与Desk和Chair中的任一个匹配
[ABC][DEF] 关联。与A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。
* 与A、B或C中任一个出现0次或多次的字符相匹配
+ 与A、B或C中任何一个出现1次或多次的字符相匹配
? 与一个空串或A、B或C在任何一个字符相匹配
(Blue|Black)berry 合并常规表达式,与Blueberry或Blackberry相匹配

2.awk算术运算符
运算符用途
——————
x^y x的y次幂
x**y 同上
x%y 计算x/y的余数(求模)
x+y x加y
x-y x减y
x*y x乘y
x/y x除y
-y 负y(y的开关符号);也称一目减
++y y加1后使用y(前置加)
y++ 使用y值后加1(后缀加)
–y y减1后使用y(前置减)
y– 使用后y减1(后缀减)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y 将x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x

3.awk允许的测试:
操作符 含义
x==y x等于y
x!=y x不等于y
x>y x大于y
x>=y x大于或等于y
x< =y x小于或等于y
x~re x匹配正则表达式re
x!~re x不匹配正则表达式re

4.awk的操作符(按优先级升序排列)
= 、+=、 -=、 *= 、/= 、 %=
||
&&
>; >;= < <= == != ~ !~
xy (字符串连结,’x’’y’变成”xy”)
+ -
* / %
++ –

5.awk内置变量(预定义变量)
说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawk
V 变量 含义 缺省值
——————————————————–
N ARGC 命令行参数个数
G ARGIND 当前被处理文件的ARGV标志符
N ARGV 命令行参数数组
G CONVFMT 数字转换格式 %.6g
P ENVIRON UNIX环境变量
N ERRNO UNIX系统错误消息
G FIELDWIDTHS 输入字段宽度的空白分隔字符串
A FILENAME 当前输入文件的名字
P FNR 当前记录数
A FS 输入字段分隔符 空格
G IGNORECASE 控制大小写敏感0(大小写敏感)
A NF 当前记录中的字段个数
A NR 已经读出的记录数
A OFMT 数字的输出格式 %.6g
A OFS 输出字段分隔符 空格
A ORS 输出的记录分隔符 新行
A RS 输入的记录他隔符 新行
N RSTART 被匹配函数匹配的字符串首
N RLENGTH 被匹配函数匹配的字符串长度
N SUBSEP 下标分隔符 “34″

6.awk的内置函数
V 函数 用途或返回值
————————————————
N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
N index(search,string) 返回string中search串的位置
A length(string) 求串string中的字符个数
N match(string,reg) 返回常规表达式reg匹配的string中的位置
N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
N split(string,store,delim) 根据分界符delim,分解string为store的数组元素
N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据
G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间
N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
A substr(string,position,len) 返回一个以position开始len个字符的子串
P totower(string) 返回string中对应的小写字符
P toupper(string) 返回string中对应的大写字符
A atan(x,y) x的余切(弧度)
N cos(x) x的余弦(弧度)
A exp(x) e的x幂
A int(x) x的整数部分
A log(x) x的自然对数值
N rand() 0-1之间的随机数
N sin(x) x的正弦(弧度)
A sqrt(x) x的平方根
A srand(x) 初始化随机数发生器。如果忽略x,则使用system()
G system() 返回自1970年1月1日以来经过的时间(按秒计算)

Go to Top