2009-12-31 22:03:00 wswifth 阅读数 8268
  • Protel99se电路设计速成

    截取实际项目中的一小部分,尽可能简单的一个小电路,通过protel99se来比较快的完成从制作电路元器件、画电路图、从电路设计切换到PCB设计、PCB元器件制作、画PCB图等这样一个比较完整的过程,接下来会逐步深入的、有重点地介绍一些比较重要的软件设置项。

    2349 人正在学习 去看看 熊健

在师哥的代码(packet.c)中使用的是Linux2.4内核中的一个子系统:netfilter,该子系统的使用可以过滤数据包,也就对数据包经行了截获,它通过调用内核网络代码中的一些hook函数完成所需要的工作。

而当一个当数据包游历Linux内核的网络堆栈时,它穿过了几个hook点,在这里,数据包可以被分析并且选择是保留还是丢弃,这些hook点就是Netfilter hook

 

而钩子函数(回调函数)也是系统内核为驱动程序提供的一些特定的函数,在驱动程序中某个变量的状态发生改变或将要改变或改变完成时,将会自动调用该回调函数,在netfilter中的状态就有五个(针对IPV4):

hook调用的时机
NF_IP_PRE_ROUTING             
在完整性校验之后,选路确定之前
NF_IP_LOCAL_IN              
在选路确定之后,且数据包的目的是本地主机
NF_IP_FORWARD                    
目的地是其它主机地数据包
NF_IP_LOCAL_OUT                 
来自本机进程的数据包在其离开本地主机的过程中
NF_IP_POST_ROUTING           
在数据包离开本地主机上线之前

 

netfilter的返回值有5种:

返回值                含义
NF_DROP                  
丢弃该数据包
NF_ACCEPT        
保留该数据包
NF_STOLEN              
忘掉该数据包
NF_QUEUE                
将该数据包插入到用户空间
NF_REPEAT        
再次调用该hook函数

 

如果要注册一个钩子函数,就要先申明一个nf_hook_ops 结构体,然后对其结构体里面的各个属性进行相应的赋值

struct nf_hook_ops
{
struct list_head list;
nf_hookfn *hook;
int pf;
int hooknum;
int priority;
};
list:链表头,用来把各个处理函数组织成一个表,初始化为{NULL,NULL};
hook:我们定义的处理函数的指针,它的返回值必须为前面所说的几个常量之一;
pf:协议族,表示这个HOOK属于哪个协议族;
hooknum:我们想要注册的钩子,取值为五个钩子之一;
priority:优先级,目前Netfilter定义了一下几个优先级,取值也小优先级也高,我们可以根据需要对各个优先级加减一个常量得到符合我们需要的优先级。
NF_IP6_PRI_FIRST = INT_MIN
NF_IP6_PRI_CONNTRACK = -200
NF_IP6_PRI_MANGLE = -150
NF_IP6_PRI_NAT_DST = -100
NF_IP6_PRI_FILTER = 0
NF_IP6_PRI_NAT_SRC = 100
NF_IP6_PRI_LAST = INT_MAX

 

 

以下是一个例子程序:

#define __KERNEL__
#define MODULE

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>

/*
用于注册我们的函数的数据结构 */
static struct nf_hook_ops nfho;

/*
注册的hook函数的实现 */
unsigned int hook_func(unsigned int hooknum,
 struct sk_buff **skb,
 const struct net_device *in,
 const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
    return NF_DROP;           /*
丢弃所有的数据包 */
}

/*
初始化程序 */
int init_module()
{
    /*
填充我们的hook数据结构 */
    nfho.hook = hook_func;         /*
该钩子对应的处理函数 */
    nfho.hooknum  = NF_IP_PRE_ROUTING; /*
使用IPv4的第一个hook */
    nfho.pf       = PF_INET;
    nfho.priority = NF_IP_PRI_FIRST;   /*
让我们的函数首先执行 */

    nf_register_hook(&nfho);  //
将用户自己定义的钩子注册到内核中

    return 0;
}

/*
清除程序 */
void cleanup_module()
{
    nf_unregister_hook(&nfho); //
将用户自己定义的钩子从内核中删除
}

2018-12-17 23:42:01 qq_40420795 阅读数 506
  • Protel99se电路设计速成

    截取实际项目中的一小部分,尽可能简单的一个小电路,通过protel99se来比较快的完成从制作电路元器件、画电路图、从电路设计切换到PCB设计、PCB元器件制作、画PCB图等这样一个比较完整的过程,接下来会逐步深入的、有重点地介绍一些比较重要的软件设置项。

    2349 人正在学习 去看看 熊健

1、cut字段提取命令

cut [选项] 文件名
选项:
-f 列号:提取第几列
-d 分隔符:按照指定分隔符分割列(不指定分隔符的话是默认采用制表符分隔)

实例1:提取用制表符制作的文件信息

实例2:提取系统中的普通用户名称(指定的分隔符为冒号)

cut命令的不足:cut命令不能截取用不等的空格隔开的数据

综上,cut命令适合于提取比较规则的文件或用制表符分隔的文件,使用起来很简单,但对于用空格分隔的文本,cut命令就很无力,此时就需要使用awk命令。而在使用awk命令之前,必须先得学会使用printf命令。

2、printf命令

printf命令与字符提取没有本质的关系,但是它是学习使用awk命令的基础,它是一种输出语句,并且是一种最原始的输出命令(毕竟linux内核是使用c语言写的)。

printf的基本语法:

printf '输出类型输出格式' 输出内容    #类似于c语言中的printf函数

输出类型有:
%ns: 输出字符串。n是数字指代输出几个字符
%ni: 输出整数。n是数字指代输出几个数字
%m.nf: 输出浮点数。m和n是数字,分别指代浮点数的总位数(包含小数点)与小数部分的位数


输出格式:
\a:输出警告声音
\b:输出退格键,也就是Backspace键
\f:清除屏幕
\n:换行
\r:回车,也就是Enter键
\t:水平输出退格键,也就是Tab键-\v:垂直输出退格键,也就是Tab键

prinf不支持数据流操作:即不能跟管道符一起使用

可见printf的操作比较原始,虽然这个命令很麻烦,但因为awk命令只能使用printf及print命令,不能识别echo命令,所以必须掌握,print与printf相比,输出内容时,不用人为的添加换行符 。

3、awk命令

awk命令是linux系统中一个非常复杂,功能强大的命令,甚至支持在命令中嵌套流程控制语句,以至于在市面上有专门讲awk命令的书籍,但作为linux系统管理来说,我们掌握它的基本的字符提取功能就ok了,其他知识等参加工作后再边查阅资料边应用足矣。

awk '条件1{动作1}条件2{动作2}...' 文件名

条件(pattern):
一般使用关系表达式作为条件
x>10判断变量x是否大于10
x>=10大于等于
x<=10小于等于

动作(action):
格式化输出
流程控制语句

实例1:提取用制表符分隔内容的文件文本

可见,在实现相同功能的情况下:cut命令要简便的多。

awk命令的执行原理:

awk虽然是个字段提取命令,但awk是这样处理的:

awk首先会将文件的第一行读取出来,然后再awk中判断条件,如果条件满足,则会执行相应的动作,上面的例子由于没有加条件,所以每一行都会执行同第一行一样的动作。这个动作首先执行的动作是,首先将文件名student.txt赋给$0,然后$1是第一个字段,$2是第二个字段……

然后第二行也重复第一行的动作,将相应字段的内容提取到对应字段中

实例:提取根分区硬盘使用占比

BEGIN条件

awk 'BEGIN{printf "This is a transcript \n"}{printf $2 "\t" $4 "\n"}' student.txt

BEGIN条件会在所有输出的内容之上,先输出"This is a transcript"

类似的END条件会在所有的内容后输出"This is a transcript"

不加BEGIN或END的话,输出结果为:

FS内置变量

cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'

 

关系运算符:

#打印成绩大于70分的人员名单
cat student.txt | grep -v Name | awk '$4>=70{printf $2 "\n"}'

结果为:

4、字符替换命令sed

想让计算机自动替换文本,就不适合使用具有交互功能的vim等编辑器,sed命令就是这样一个再shell编程中自动替换文本的命令。sed命令是一种几乎包括在所有UNIX平台(包括linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。sed命令的格式为:

sed [选项] '[动作]' 文件名

选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选项则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入的数据应用多条sed命令编辑
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作:
a:追加,在当前行后添加一行或多行
c:行替换,用c后面的字符串替换原数据行
i:插入,在当前行前插入一行或多行。
d:删除,删除指定的行
p:打印,输出指定的行
s:字串替换,用一个字符串替换另外一个字符串。格式为:"行范围s/旧字串/新字串/g"(和vim中的替换格式类似)

实例1:打印student.txt文件第二行的数据(注意加了-n与没加-n的区别)

实例2:删除student.txt文件第二行到第四行的数据,但不修改文件本身

实例3、在第二行前或第二行后加入数据

实例4、行替换c

字符串替换:

sed 's/旧字串/新字串/g' 文件名

sed -e 's/fengji//g;s/cang//g' student.txt
#同时把"fengj"和"cang"替换为空

实例5、字串替换s

实例6、-i可以改变原始文件内容

2019-05-14 17:13:31 haiziccc 阅读数 253
  • Protel99se电路设计速成

    截取实际项目中的一小部分,尽可能简单的一个小电路,通过protel99se来比较快的完成从制作电路元器件、画电路图、从电路设计切换到PCB设计、PCB元器件制作、画PCB图等这样一个比较完整的过程,接下来会逐步深入的、有重点地介绍一些比较重要的软件设置项。

    2349 人正在学习 去看看 熊健

安装RPM时有以下报错,想快速弄清楚有哪些依赖包需要安装,可将报错信息写入文件,我这里命名err,再行分析。因避免占用太大篇幅,此处只摘取前两条。
Error: Package: kmod-elx-lpfc-xen-8.2.2.33-1.rhel5u11.x86_64 (/kmod-elx-lpfc-xen-8.2.2.33-1.rhel5u11.x86_64)
           Requires: kernel(rhel5_arch_x86_64_lib_ga) = 16fa19a50e0570e763d7e64602b9a86d2247a9f3
Error: Package: kmod-elx-lpfc-xen-8.2.2.33-1.rhel5u11.x86_64 (/kmod-elx-lpfc-xen-8.2.2.33-1.rhel5u11.x86_64)
           Requires: kernel(rhel5_drivers_pci_u5) = 162dcd5217593b75904962b48654452f4302fccb
1、执行awk '{print $2}' err|grep kernel|cut -d "(" -f 2|cut -d ")" -f 1即可得到如下结果:
rhel5_arch_x86_64_lib_ga
rhel5_drivers_pci_u5
2、执行cut -d "(" -f 2 err|cut -d ")" -f 1|grep rhel5_得到如下结果:
rhel5_arch_x86_64_lib_ga
rhel5_drivers_pci_u5
方法有多种多样,通过python分词应该也很好实现。

2018-06-25 16:02:21 qq_36142062 阅读数 596
  • Protel99se电路设计速成

    截取实际项目中的一小部分,尽可能简单的一个小电路,通过protel99se来比较快的完成从制作电路元器件、画电路图、从电路设计切换到PCB设计、PCB元器件制作、画PCB图等这样一个比较完整的过程,接下来会逐步深入的、有重点地介绍一些比较重要的软件设置项。

    2349 人正在学习 去看看 熊健

Linux sed命令是利用script来处理文本文件。 sed可依照script的指令,来处理、编辑文本文件。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

Sed可以将数据进行取代、删除、新增、选取特定行等等的功能,可以说是非常的实用。
首先,我们先man一下,看看sed有哪些选项参数。
这里写图片描述
光看是没用的,我们来实地操作一下就明了。

1、 以行为单位的新增/删除功能;

将/etc/passwd的内容列出并打印行号,同时,将2~5行删除。
这里写图片描述
如上图,2~5行消失了吧,我们此处的d就是删除的意思啦;此处要注意的是sed后面接的动作要加上单引号哦。
前面我们是删除2~5行,那么,如果只是删除某一行呢?
这里写图片描述
如上图,我们在sed的后面只加上2d就表示删除第二行了,切记要加单引号。

当我们的行数很多,并且,想删除后面的所有行,又应该怎么办呢?
这里写图片描述
看了上图的操作是不是明白了呢?$就代表最后一行,这样就可以删除后面的所有行啦。
好了,该删的也删了,是时候展现真正的技术了,哈哈!我们来一起看看新增的方法吧。
这里写图片描述
注意看上图,在第三行后面加上hello,此处的a就代表后面的意思,动作(3a)与要添加的内容之间要空格隔开,而且不能忘记单引号。
前面我们是添加一行内容,如果要添加多行呢?
这里写图片描述
当我们要添加多行时,在添加的第一行内容结束后加上\,依次类推,前面的那个单引号不动,后面的单引号要放到添加内容的最后一行的后面。
我们在修改文本时,不仅要在行后添加,还会碰到在行前添加,那又如何操作呢?
这里写图片描述
在行前添加内容只需要吧原来的a换成i即可。

2、 以行为单位的显示功能;

刚刚介绍的是增加与删除,现在我们聊聊整行显示的方法;
这里写图片描述
如上图,sed的显示是按行号的。

3、 部分数据的搜寻并取代的功能;

这里写图片描述
如上图,第一条命令取出了2~4行;第二条命令在取出内容的基础上把所有的bin替换为hello;其中的sbin也替换为了shello。(替换的动作前面是s,后面是g;三个/分隔出两个区域,前面是将要被替换的内容,后面是替换的新内容;)

现在我们用ifconfig输出的内容截取出ip,演示一次截取并替换的操作;
首先在屏幕上打印出对应的网卡信息;
这里写图片描述
grep搜索关键字,锁定有ip的行;
这里写图片描述
sed把ip前面的内容替换为空;
这里写图片描述
然后,再把ip后面的内容替换为空;
这里写图片描述

sed除了把文件内容打印出来,还可以直接在原始文件中做操作,只需要加个-i选项;如果要查看修改结果,只能自己另行操作。(此处在man_db.conf的第一行前加一行‘# this is a test’)
这里写图片描述

此文章参考‘鸟哥的私房菜’只为共享,如有侵权请告知版主并删除。

2019-03-23 16:54:56 weixin_42146366 阅读数 29
  • Protel99se电路设计速成

    截取实际项目中的一小部分,尽可能简单的一个小电路,通过protel99se来比较快的完成从制作电路元器件、画电路图、从电路设计切换到PCB设计、PCB元器件制作、画PCB图等这样一个比较完整的过程,接下来会逐步深入的、有重点地介绍一些比较重要的软件设置项。

    2349 人正在学习 去看看 熊健

一、这篇博客主要介绍字符截取命令
1、cut 字段提取命令,2、printf 命令,3、awk 命令,4、sed 命令。

场景模拟提前准备一个测试文件:student.txt,用来存放测试数据,使用 Vim编辑器准备这个测试文件,如下图:
①、vim student.txt
在这里插入图片描述
②、编辑如下内容:
在这里插入图片描述
注意:测试文件的空格使用【Tab】键,因为 cut 命令默认是截取的字符是【Tab】键。

二、cut 字段截取命令
1、 cut 【选项】【文件名】,功能:截取字符串的特定字符。
{ -f 列号:提取第几列,-d 分隔符: 按照指定分隔符来分割列 }

【1】cut -f 2 student.txt,功能:截取student.txt文件中以【Tab】键为分隔符的第二列的字符,如下图所示:
在这里插入图片描述
【2】cut -d “:” -f 1,3 /etc/passwd,功能:截取 /ect/passwd 文件中以 : 键为分隔符的第1列,第3列的字符,如下图所示:
在这里插入图片描述
2、 printf “输出类型输出格式” 【输出的内容】
输出类型:
①、%ns: 输出字符串,n代表输出几个字符。
②、%ni: 输出整数,n代表输出几个整数。
③、%m,nf: 输出浮点数,m代表输出的数一共有多少位数,n代表输出的小数位数,例如 %8.2f 表示一共输出8个数,其中有2为小数,6为整数。

下面举几个例子:
【1】printf ‘%s %s %s\n’ 1 2 3 4 5 6
在这里插入图片描述
【2】printf ‘%i\n’ 123 456
在这里插入图片描述
【3】printf ‘%8.2f\n’ 123456.789
在这里插入图片描述
3、awk ‘条件1{动作1} 条件2{动作2}… ’ 【文件名】
【1】awk ‘{printf $2 “\t” $3 “\n”}’ student.txt,功能:输出 student.txt 文件中第2列,第3列的内容, $ 2, $3代表列数,“ \t ”代表Tab键,“ \n ”代表换行。
在这里插入图片描述
【2】 awk ‘BEGIN{printf “这是BEGIN!”}{printf $2 “\t” $3 “\n”}’ student.txt,功能:在输出student.txt文件中的第2列,第3列之前输出 " 这是BEGIN!"语句。
在这里插入图片描述
【3】awk ‘END{printf “这是END” “\n”}{printf $2 “\t” $3 “\n”}’ student.txt,功能:在输出student.txt文件中的第2列,第3列之后输出 " 这是END!"语句。
在这里插入图片描述
4、sed 【选项】’{动作}’ 【文件名】
选项:
①、-n:只会把经过 sed 命令处理行输出到屏幕。(一般都要用到)
②、-e:允许对输入数据应用多条sed 命令进行处理。
③、-i:用sed命令修改结果会直接修改到文件,而不是由屏幕输出。(建议不要使用,如果想改文件的话还是使用Vim编辑器比较好)

动作:
①、-d:删除功能,删除指定行。
②、-p:打印功能,输出指定行。
③、-s:字符替换,用一个字符替换另外一个字符,格式->“行范围 s / 旧字符 / 新字符 / g”。
④、-a:在当前的行的下一行追加指定字符。
⑤、-i:在当前的行首插入指定字符。
⑥、-c:替换当前行的所有内容为指定的内容。

下面举几个例子:
【1】 sed -n ‘3p’ student.txt ,功能:获取 student.txt 文件中的第3行的内容。
在这里插入图片描述
【2】sed ‘1,3d’ student.txt,功能:删除文件1到3行的内容并且输出结果,但是并不改变 student.txt的内容,即重新打开 student.txt文件,文件内容没有发生改变。
在这里插入图片描述
【3】 sed ‘3a HelloWorld’ student.txt,功能:在 student.txt的第3行的下一行追加一个HelloWorld。
在这里插入图片描述
【4】sed ‘3i HelloWorld’ student.txt,功能:在 student.txt的第3行的上一行追加一个HelloWorld。
在这里插入图片描述
【5】sed ‘3c HelloWorld’ student.txt,功能:将student.txt的第3行的全部内容替换成 HelloWorld。
在这里插入图片描述
【6】sed ‘5s/B/BB/g’ student.txt,功能:将 student.txt 文件中第5行的内容为B的旧字符替换成新字符BB。
在这里插入图片描述
三、总结
多多练习就可以掌握了,或者说先了解这些内容,把常用的命令掌握了就好,其他的命令等用到再查也行,到时候自然会掌握的。

没有更多推荐了,返回首页