文本处理三剑客之AWK

AWK的基本格式:

   awk [options] 'program' file…      
   注释: 
   program->pattern{action statements;..}
   pattern和action:
   •pattern部分决定动作语句何时触发及触发事件
(BEGIN,END)
   •action statements对数据进行处理,放在{}内指明
(print, printf)

awk工作原理:

    第一步:执行BEGIN{action;… }语句块中的语句

    第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

    第三步:当读至输入流末尾时,执行END{action;…}语句块

    注意:pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块


   awk [options] 'program' file…      
   program->pattern{action statements;..}
   pattern和action:
   •pattern部分决定动作语句何时触发及触发事件
(BEGIN,END)
   •action statements对数据进行处理,放在{}内指明
(print, printf)
注意:awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成。BEGIN语句块和END语句块分别为文家处理前和处理后执行的语句段

1)OPTIONS

 

  选项(options):

    -F指明输入时用到的字段分隔符(默认以空格为分隔符)
    -v var内置变量|var=value: 自定义变量

    变量分为内置变量和自定义变量:

●内置变量:

FS:输入字段分隔符,默认为空白字符(与-F效果相同)

[root@dashui ~]# awk -v FS=":" '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2

OFS:输出字段分隔符,默认为空白字符

[root@dashui ~]# awk -v FS=":" -v OFS="*" '{print $1,$3}' /etc/passwd
root*0
bin*1
daemon*2

RS:输入记录分隔符,指定读入时的换行符,原换行符仍有效

[root@dashui ~]# awk -v RS=' '  '{print}' hah    //指定读入时的分割符,只要出现空格就被换行
nihao
a
haha
i
amfanin

[root@dashui ~]# cat hah 
nihao a haha
i amfanin

ORS:输出记录分隔符,输出时用指定符号代替换行符

[root@dashui ~]# cat hah 
nihao a haha
i amfanin
[root@dashui ~]# awk -v ORS='=== '  '{print}' hah     //指定输出分隔符为===,所以原来换行被替换成===
nihao a haha=== i amfanin=== [root@dashui ~]#

NF:字段数量

[root@dashui ~]# awk -F: '{print NF}' /etc/passwd    //以:为分隔符,每一行有几个字段
7
7
7

NR:行号(如果有多个文件,则行号统计在一起)

[root@dashui ~]# awk '{print NR}' hah
1
2
[root@dashui ~]# awk '{print NR}' hah /etc/fstab       //hah的行号和/etc/fstab的统计在了一块   
1
2
3
4
5
6
7
8
9
10
11
12
13
14

FNR:各文件分别计数,行号

[root@dashui ~]# awk '{print FNR}' hah /etc/fstab 
1
2
1
2
3
4
5
6
7
8
9
10
11
12

FILENAME:当前文件名

[root@dashui ~]# awk '{print FILENAME}' hah //因为前面的pattern没有写,所以默认每读入一行,就执行一次print
hah
hah
[root@dashui ~]# cat hah 
nihao a haha
i amfanin

ARGC:命令行参数的个数

[root@dashui ~]# awk '{print ARGC}' hah     //其中第一个参数为awk ,第二个为 hah
2
2

ARGV:数组,保存的是命令行所给定的各参数

[root@dashui ~]# awk '{print ARGV[0]}' hah     //0是第一个参数,1是第二个参数
awk
awk
[root@dashui ~]# awk '{print ARGV[1]}' hah 
hah
hah

●自定义变量
  (1) -v var=value
    变量名区分字符大小写
  (2) 在program中直接定义

[root@dashui ~]# awk -v name=xiaoshui 'BEGIN{print name}'
xiaoshui
[root@dashui ~]# awk 'BEGIN{name="xiaozhao";print name}'
xiaozhao

    注意:自定义变量时需要加上双引号,不加的话可能会定义不成功,如下

[root@dashui ~]# awk 'BEGIN{name=xiaozhao;print name}'

[root@dashui ~]# awk 'BEGIN{name="xiaozhao";print name}'
xiaozhao

2)program

    program分为pattern和action

  •pattern部分决定动作语句何时触发及触发事件
(BEGIN,END)
   •action statements对数据进行处理,放在{}内指明
(print, printf)

(1)action(print、printf)

•Expressions:算术,比较表达式等
•Control statements:if, while等
•Compound statements:组合语句
•input statements
•output statements:print等

    print   

print格式:print item1, item2, …

    •(1) 逗号分隔符
    •(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
    •(3) 如省略item,相当于print $0

[root@dashui ~]# awk -F : '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
[root@dashui ~]# awk -F : '{print $1,"xiaoshui",$3}' /etc/passwd
root xiaoshui 0
bin xiaoshui 1
daemon xiaoshui 2
[root@dashui ~]# awk -F : '{print }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

    printf

格式化输出:printf“FORMAT”, item1, item2, …
    (1) 必须指定FORMAT
    (2) 不会自动换行,需要显式给出换行控制符,\n
    (3) FORMAT中需要分别为后面每个item指定格式符

格式符:与item一一对应

    %c: 显示字符的ASCII码
    %d, %i: 显示十进制整数
    %e, %E:显示科学计数法数值
    %f:显示为浮点数
    %g, %G:以科学计数法或浮点形式显示数值
    %s:显示字符串
    %u:无符号整数
    %%: 显示%自身

修饰符:

    #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
    -: 左对齐(默认右对齐)%-15s
    +:显示数值的正负符号%+d

[root@dashui ~]# awk -F : '{printf "%s %d\n",$1,$3 }' /etc/passwd    //如果不加\n默认是不换行的
root 0
bin 1
daemon 2

(2)pattern

PATTERN:根据pattern条件,过滤匹配的行,再做处理

    (1)如果未指定:空模式,匹配每一行
    (2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

[root@dashui ~]# awk '/^UUID/{print $1}' /etc/fstab // 以UUID开头的行
UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05f
UUID=bf3d4b2f-4629-4fd7-8d70-a21302111564
UUID=cbf33183-93bf-4b4f-81c0-ea6ae91cd4f6
UUID=5e11b173-f7e2-4994-95b9-55cc4c41f20b

    (3) relational expression: 关系表达式,结果有“真”有“假”,结果为“真”才会被处理
      真:结果为非0值,非空字符串
      假:结果为空字符串或0值

[root@dashui ~]# awk '0{print $0}' hah    //因为前面为0,所以不执行
[root@dashui ~]# awk '!0{print $0}' hah    //与上面相反
nihao a haha
i amfanin
[root@dashui ~]# awk -F: '$3==0{print $0}' /etc/passwd    //只有当$3=0时候,才会执行print
root:x:0:0:root:/root:/bin/bash

    (4) line ranges:行范围

startline,endline:/pat1/,/pat2/不支持直接给出数字格式

[root@dashui ~]# awk -F: '/^root\>/,/^daemon\>/{print}' /etc/passwd    //打印以root开头与以daemon开头的之间的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@dashui ~]#

    (5)(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次

[root@dashui ~]# awk 'BEGIN{print "start"}{print $0}END{print "end"}' hah    //在开始和结束时候分别打印start和end
start
nihao a haha
i amfanin
end
[root@dashui ~]# cat hah
nihao a haha
i amfanin

AWK的操作符

算术操作符:
    x+y, x-y, x*y, x/y, x^y, x%y
    -x: 转换为负数
    +x: 转换为数值

[root@dashui ~]# awk 'BEGIN{i=1;j=2;sum=i+j;{print sum}}'    
3

字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
    =, +=, -=, *=, /=, %=, ^=
    ++, —
比较操作符:
    >, >=, <, <=, !=, ==
模式匹配符:
    ~:左边是否和右边匹配包含    
    !~:是否不匹配

[root@dashui ~]# awk -F: '$1~"root"{print $0}' /etc/passwd    //当$1即usrename为root或者包含 root时候,执行print
root:x:0:0:root:/root:/bin/bash
chroot:x:1003:1003:,62984566:/home/chroot:/bin/bash
rooter:x:3320:4327:,62984566:/home/rooter:/bin/bash
[root@dashui ~]# awk -F: '$3<2{print $0}' /etc/passwd    //$3即uid小于2时,执行print
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

逻辑操作符:与&&,或||,非!

[root@dashui ~]# awk -F: '$3>1000 && $3<2000{print $0}' /etc/passwd
xiaoshui:x:1001:1001:xiaoshui,342342342:/home/xiaoshui:/bin/bash
chroot:x:1003:1003:,62984566:/home/chroot:/bin/bash
centos:x:1004:1004:,62984566:/home/centos:/bin/bash
[root@dashui ~]# awk -F: '$1=="root" || $1=="xiaoshui"{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
xiaoshui:x:1001:1001:xiaoshui,342342342:/home/xiaoshui:/bin/bash

awk控制语句

●{ statements;… } 组合语句
if(condition) {statements;…}
if(condition) {statements;…} else {statements;…}
while(conditon) {statments;…}
do {statements;…} while(condition)
for(expr1;expr2;expr3) {statements;…}
break
continue
delete array[index]
delete array
exit

(1){ statements;… } 组合语句

[root@dashui ~]# awk '{a=1;print a}' hah    //将多个语句组合在一起
1
1

(2)if(condition) {statements;…}

[root@dashui ~]# awk -F: '{if($3==0){print $0}}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

    注意:条件在小括号中,条件后的语句需在{ }中

(3)if(condition) {statements;…} else {statements;…}

        if(condition1){statement1}else if(condition2){statement2}else{statement3}

[root@dashui ~]# awk '{if($0=="dashui"){print "dashui"} else{print "not dashui"}}' hah
not dashui
not dashui
dashui
[root@dashui ~]# cat hah
nihao a haha
i amfanin
dashui

(4)while(conditon) {statments;…}

//下面是找到以空格开头后跟linux16的行,将匹配到的行中的每个字段的长度与8比较,大于8的输出
[root@dashui ~]# awk '/^[[:space:]]+linux16/{i=1;while(i<=NF){if(length($i)>8){print $i,length($i)};i++}}' /etc/grub2.cfg 
/vmlinuz-3.10.0-327.el7.x86_64 30
root=UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05f 46
net.ifnames=0 13
/vmlinuz-0-rescue-3f3be6c44d1047a8b32f91efd2f2c5ab 50
root=UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05f 46
net.ifnames=0 13

    做上面的实验时,因为手抖输出了点,将if后面的print中i前面的$符号给忘记了,结果就成了下面的情况

[root@dashui ~]# awk '/^[[:space:]]+linux16/{i=1;while(i<=NF){if(length($i)>8){print i,length(i)};i++}}' /etc/grub2.cfg 
2 1
3 1
7 1
2 1
3 1
7 1
//分析:print i,因为前面i赋值的是数字,本意是想打印$i,即各个字段,当$符号丢掉时,i也只是代表数字了
所以打印出来的237237表示的就是第几个字段,而length(i)就更好理解了,因为length()就是求括号中的
字符串的长度,且因为i都为个位数,所以就为1喽(注意:如果单单是length(i),i之前没有被定义,此时打印出来
的为0,以为i之前没有被定义,所以为空)

(5)do-while循环

语法:do {statement;…}while(condition)
意义:无论真假,至少执行一次循环体

[root@dashui ~]# awk 'BEGIN{i=0;do{i++}while(i<1){print i}}'
1
[root@dashui ~]# awk 'BEGIN{i=0;do{i++}while(i<=1){print i}}'
2

(6)for循环

语法:for(expr1;expr2;expr3) {statement;…}

[root@dashui ~]# awk '/^[[:space:]]+linux16/{for(i=1;i<NF;i++){print $i}}' /etc/grub2.cfg 
linux16
/vmlinuz-3.10.0-327.el7.x86_64
root=UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05f
ro
rhgb
quiet
linux16
/vmlinuz-0-rescue-3f3be6c44d1047a8b32f91efd2f2c5ab
root=UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05f
ro
rhgb
quiet

特殊用法:能够遍历数组中的元素;
语法:for(varin array) {for-body}

[root@dashui ~]# awk -F: '{bash[$7]++}END{for (i in bash){print i,bash[i]}}' /etc/passwd
/etc/nologin 2
/bin/sync 1
/bin/bash 47
/shell/csh 1
/sbin/nologin 34
/sbin/halt 1
/bin/csh 2
/sbin/shutdown 1
[root@dashui ~]#

(7)switch语句

语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}

(8)breakcontinue

    break表示跳出循环,而continue表示跳过本轮循环

[root@dashui ~]# awk 'BEGIN{sum=0;for(i=1;i<10;i++){if(i==5){break}print i}}'
1
2
3
4
[root@dashui ~]# awk 'BEGIN{sum=0;for(i=1;i<10;i++){if(i==5){continue}print i}}'
1
2
3
4
6
7
8
9

(9)next

    提前结束对本行处理而直接进入下一行处理(awk自身循环)

#$3%2!=0即uid为奇数,跳过此行,即只打印uid为偶束的行
[root@dashui ~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12


awk数组

    关联数组:array[index-expression]

index-expression:

•(1) 可使用任意字符串;字符串要使用双引号括起来
•(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串
•若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历

#注意:如果数组的键值为字符串时,最后以双引号给引起来
[root@dashui ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
Monday

若要遍历数组中的每个元素,要使用for循环

[root@dashui ~]# netstat -tan|awk '/^tcp\>/{state[$NF]++}END{for(i in state){print i,state[i]}}'
LISTEN 3
ESTABLISHED 1

awk函数

●数值处理:
rand():返回0和1之间一个随机数

#注意:需配合srand()函数使用,不然不是随机数
[root@dashui ~]# awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100)}'
54
45
23
24
14
72
56
92
31
31

●字符串处理:

•length([s]):返回指定字符串的长度

•sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s

•gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

[root@dashui ~]# echo "2008:08:08 08:08:08"|awk 'sub(":","-",$0)'
2008-08:08 08:08:08
[root@dashui ~]# echo "2008:08:08 08:08:08"|awk 'gsub(":","-",$0)'
2008-08-08 08-08-08
[root@dashui ~]#

•split(s,array,[r]):以r为分隔符,切割字符s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…

#这里使用split函数将第五个字段中的ip和端口号分开,只取出了ip。
[root@dashui ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
10.1.0.82 1
0.0.0.0 3
[root@dashui ~]# netstat -tan 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0     52 10.1.0.26:22            10.1.0.82:54143         ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
[root@dashui ~]#

•自定义函数

格式:
    function name ( parameter, parameter, … ) {
    statements
    return expression

    }

#这里自定义了一个函数,求出两个变量的最大值。
[root@dashui ~]# awk -f awk.fun 
3
[root@dashui ~]# cat awk.fun 
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}

    注意:和之前的shell中的函数有些不同,这里如果需要像awk函数中传递变量,则需要在括号中定义形参。


awk中调用shell命令

system命令

[root@dashui ~]# awk BEGIN'{system("hostname")}'
dashui.localdomain

空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用""引用起来。

[root@dashui ~]# awk 'BEGIN{name="xiaoshui";system("echo your name is " name)}'
your name is xiaoshui


awk脚本

将awk程序写成脚本,直接调用或执行

#将action写入到脚本中,然后调用执行
[root@dashui ~]# awk -F: -f f1.awk /etc/passwd
root 0
bin 1
daemon 2
adm 3
hu 
[root@dashui ~]# cat f1.awk 
{if($3<4)print $1,$3}
#  脚本文件中的/bin/awk -f表示是用awk -f来执行下面语句
[root@dashui ~]# ./f1.awk -F: /etc/passwd
root 0
bin 1
daemon 2
adm 3
hu 
[root@dashui ~]# cat f1.awk 
#!/bin/awk -f
#this is a awk script
{if($3<4)print $1,$3}


向awk脚本传递参数

 格式:
    awkfile var=value var2=value2… Inputfile

# min和max分别对应脚本文件中的min和max
[root@dashui ~]# ./f1.awk -F: min=100 max=200 /etc/passwd
avahi-autoipd 170
abrt 173
rtkit 172
usbmuxd 113
pulse 171
[root@dashui ~]# cat f1.awk 
#!/bin/awk -f
{if($3>=min && $3<=max)print $1,$3}


强化练习

1.打印一个表头,并且打印用户名和ID

[root@dashui ~]# awk -F: 'BEGIN{printf "Username           UID\n"}{printf "%-20s %d\n",$1,$3}' /etc/passwd
Username           UID
root                 0
bin                  1
daemon               2
adm                  3
lp                   4
sync                 5
shutdown             6
halt                 7
mail                 8
operator             11
games                12

2.打印一个表头和表尾,并打印用户名,ID,及shell

[root@dashui ~]# awk -F: 'BEGIN{printf "Username           UID     Shell\n"}{printf "%-20s %d %10s\n",$1,$3,$5}END{print "Finished..."}' /etc/passwd

Username           UID     Shell
root                 0       root
bin                  1        bin
daemon               2     daemon
adm                  3        adm
lp                   4         lp
sync                 5       sync
shutdown             6   shutdown
...省略...
haha                 4376           
xixi                 4377           
hehe                 4378           
Finished...
[root@dashui ~]#

3.对文本中的字段进行字符个数统计

[root@dashui ~]# awk '{print $0,length($0)}' hah
nihao a haha 12
i amfanin 9
dashui 6

4.打印字符个数大于等于8的字段

#其实就是比题3多了一条if判断语句
[root@dashui ~]# awk '{if(length($0)>8){print $0,length($0)}}' hah
nihao a haha 12
i amfanin 9

5.统计系统中shell的类型,并打印shell引用的次数

#中间运用了数组和for循环
[root@dashui ~]# awk -F: '{count[$7]++}END{for (i in count){print i,count[i]}}' /etc/passwd
/etc/nologin 2
/bin/sync 1
/bin/bash 47
/shell/csh 1
/sbin/nologin 34
/sbin/halt 1
/bin/csh 2
/sbin/shutdown 1

6.统计fstab文件中,各文件系统被引用的次数

#比上题多了一步地址定界
[root@dashui ~]# awk '/^[^#]/{count[$3]++}END{for (i in count){print i,count[i]}}' /etc/fstab 
swap 1
xfs 3

7.统计系统中各TCP连接状态的数量

[root@dashui ~]# netstat -tan|awk '/^tcp\>/{state[$6]++}END{for (i in state){print i,state[i]}}'
LISTEN 3
ESTABLISHED 1

8.将文本的重复行去掉

#第一次读取aaa,arr[aaa]因为没有定义,所以为空,又取非,所以为真,arr[aaa]++是先赋值后加加,所以第一次打印出来
#第二次,在遇见aaa时候,因为之前有值了arr[aaa]=1,所以取反为0,不执行后的print操作,但是++依然正常运行
[root@dashui ~]# awk '!arr[$0]++' hah
aaa
bbb
ccc
ddd
fff

[root@dashui ~]# cat hah 
aaa
bbb
ccc
aaa
ddd
aaa
aaa
fff
ccc

[root@dashui ~]#

                                                                                               谢谢浏览,以后会不定时更新…

原创文章,作者:我的滑板鞋,如若转载,请注明出处:http://www.178linux.com/48383

(1)
我的滑板鞋我的滑板鞋
上一篇 2016-09-22
下一篇 2016-09-23

相关推荐

  • 如何查看当前系统版本的版本号

    作为一名系统管理员,了解系统版本号是必然。因为不同大版本之间的命令和启动流程等之间有很大的差异;     一、在/etc/system-release 里面查看         ~]#ls -l /etc/system-release &n…

    Linux干货 2016-07-29
  • Linux下软件包安装(rpm,yum)

    Linux下软件包安装(rpm,yum,源代码) 1)    Rpm包管理安装 2)    Yum包程序管理器 3)    本地Yum仓库建制 ======================================= 1) …

    Linux干货 2016-06-22
  • 关于IO的同步,异步,阻塞,非阻塞

    上次写了一篇文章:Unix IO 模型学习。恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现。中途正好讨论了网络IO的同步、异步、阻塞、非阻塞的概念,当时讲下来,大家的理解各不相同,各执己见。搜索了网络上的一些文章,观点也各不相同,甚至连wiki也将异步和非阻塞当成一个概念在解释。  &…

    Linux干货 2015-04-02
  • 少走冤枉路!带你走过SNMP的那些坑

    SNMP(Simple Network Management Protocol)即简单网络管理协议,是在网络与系统监控领域中,最常使用的一种数据采集技术。尽管这个协议非常简单,但在大规模IT环境监测中,还是经常会碰到各种坑,因此优云开源了一套友好的SNMPAPI,并通过本文简单介绍这套API中的一些特点,希望帮助各位运维同仁提前规避一些问题。 特点[0].&…

    2016-06-22
  • 正则表达式的概念和用法

    概念 正则表达式是对字符串操作的一种逻辑表达方式,很多情况下我们需要在茫众多的文件中找到我们需要的文件时,就需要用到正则表达式了 正则表达式就如同一个过滤器,能够筛选出希望得到的字符串。它可以检索、替换符合我们自己规定格式的所有文本。 正则表达式分两类: 基本正则表达式 扩展正则表达式 正则表达式的用法和选项 在Linux中,正则表达式通常会配合文本过滤工具…

    2017-06-10
  • 马哥教育网络第20期第八周课程练习

    1、 请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。在局域网内,大量主机之间的通信通过arp广播来连接目的主机地址的,为减少在共享环境里的介质,网桥的作用是将广播域划分为多个小的冲突域,但广播域没有变。工作在OSI数据链路层,端口很少。基于软件。可以处理上层事务。 集线器:对接收到的信号进行再生整形放大,扩大网络传输距离,工作在O…

    Linux干货 2016-08-15

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-23 11:47

    写的很详细,每一个选项,甚至是变量都有相应的示例,可以看出作者用心哦。