Linux学习高级篇(四)

来源:互联网 发布:w7怎么添加网络打印机 编辑:程序博客网 时间:2024/06/05 00:16



1正则表达式



1.1正则与通配符

  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配grepawksed等命令可以支持正则表达式。

  • 通配符用来匹配符合条件的文件名,通配符是完全匹配lsfindcp这些命令不正则表达式,所以只能使用shell自己的通配符来进行匹配了 。


1.2基础正则表达式

元字符作 用*前一个字符匹配0次或任意多次。.匹配除了换行符外任意一个字符。^匹配行首。例如:^hello会匹配以hello开头的行。$匹配行尾。例如:hello&会匹配以hello结尾的行。[]匹配中括号中指定的任意一个字符,只匹配一个字符。
例如:
[aoeiu] 匹配任意一个元音字母[0-9] 匹配任意一位
数字, [a-z][0-9]匹配小写字和一位数字构成的两位字符。
[^]匹配除中括号的字符以外的任意一个字符。例如:[^0-9]匹配
任意一位非数字字符,
[^a-z] 表示任意一位非小写字母。\转义符。用于取消讲特殊符号的含义取消。\{n\}表示其前面的字符恰好出现n次。例如:[0-9]\{4\}匹配4位数
字,
[1][3-8][0-9]\{9\} 匹配手机号码。\{n,\}表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}表示两
位及以上的数字。
\{n,m\}表示其前面的字符至少出现n次,最多出现m次。例如:[a
z]\{6,8\} 
匹配68位的小写字母。



2字符串截取


2.1 cut字段提取命令

[root@localhost ~]# cut [选项]文件名

选项:

-f 列号:提取第几列

-d 分隔符:按照指定分隔符分割列


2.2 printf命令 

printf’输出类型输出格式’输出内容

输出类型:

%ns:输出字符串。n是数字指代输出几个字符

%ni:输出整数。n是数字指代输出几个数字

%m.nf: 输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数



输出格式:

\a: 输出警告声音

\b: 输出退格键,也就是Backspace键

\f: 清除屏幕

\n: 换行

\r: 回车,也就是Enter键

\t: 水平输出退格键,也就是Tab键

\v: 垂直输出退格键,也就是Tab键


2.3 awk命令


# awk ‘条件1{动作1}条件2{动作2}…’文件名

条件(Pattern):

一般使用关系表达式作为条件

x > 10判断变量 x是否大于10

x>=10大于等于

x<=10小于等于


2.4 sed命令


sed 是一种几乎包括在所有UNIX平台(包括 Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。


[root@localhost ~]# sed [选项] ‘[动作]’ 文件名

选项:

-n: 一般sed命令会把所有数据都输出到屏幕 ,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。

-e: 允许对输入数据应用多条sed命令编辑

-i: 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出


动作:

a \: 追加,在当前行后添加一行或多行。添加多行时,除最后 一行外,每行末尾需要用“\”代表数据未完结。

c \: 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。

i \: 插入,在当期行前插入一行或多行。插入多行时,除最后 一行外,每行末尾需要用“\”代表数据未完结。

d: 删除,删除指定的行。

p: 打印,输出指定的行。

s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。


例如:查看文件的第二行

[root@localhost ~]# sed '2p' 文件名




3字符处理命令



3.1排序命令sort

[root@localhost ~]# sort [选项] 文件名

选项:

-f: 忽略大小写

-n: 以数值型进行排序,默认使用字符串型排序

-r: 反向排序

-t: 指定分隔符,默认是分隔符是制表符

-k n[,m]: 按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)

#排序用户信息文件

[root@localhost ~]# sort /etc/passwd

#反向排序

[root@localhost ~]# sort -r /etc/passwd

#指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序

[root@localhost ~]# sort -t ":" -k 3,3 /etc/passwd


[root@localhost ~]# sort -n -t ":" -k 3,3 /etc/passwd

3.2统计命令wc

[root@localhost ~]# wc [选项] 文件名

选项:

-l: 只统计行数

-w: 只统计单词数

-m: 只统计字符数

4条件判断


4.1按照文件类型进行判断

测试选项作 用

-b 文件判断该文件是否存在,并且是否为块设备文件(是块设备文件

为真)

-c文件判断该文件是否存在,并且是否为字符设备文件(是字符设备

文件为真)

-d 文件判断该文件是否存在,并且是否为目录文件(是目录为真)

-e 文件判断该文件是否存在(存在为真)

-f 文件判断该文件是否存在,并且是否为普通文件(是普通文件为真)

-L 文件判断该文件是否存在,并且是否为符号链接文件(是符号链接

文件为真)

-p 文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)

-s 文件判断该文件是否存在,并且是否为非空(非空为真)

-S 文件判断该文件是否存在,并且是否为套接字文件(是套接字文件

为真 例如:

[root@localhost ~]# test -e /an.txt

4.2按照文件权限进行判断

测试选项作 用

-r 文件判断该文件是否存在,并且是否该文件拥有读权限(有读

权限为真)

-w文件判断该文件是否存在,并且是否该文件拥有写权限(有写

权限为真)

-x 文件判断该文件是否存在,并且是否该文件拥有执行权限(有

执行权限为真)

-u 文件判断该文件是否存在,并且是否该文件拥有SUID权限(有

SUID权限为真)

-g 文件判断该文件是否存在,并且是否该文件拥有SGID权限(有

SGID权限为真)

-k 文件判断该文件是否存在,并且是否该文件拥有SBit权限(有

SBit权限为真)

4.3两个文件之间的比较

测试选项作 用

文件1 -nt 文件2判断文件1的修改时间是否比文件2的新(如果新则为真

文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果旧则为真

文件1 -ef 文件2判断文件1是否和文件2的Inode号一致,可以理解为两个

文件是否为同一个文件。这个判断用于判断硬链接是很

好的方法

4.4两个整数之间的比较

测试选项作 用

整数1 -eq 整数

2判断整数1是否和整数2相等(相等为真)

整数1 -ne 整数

2判断整数1是否和整数2不相等(不相等位置)

整数1 -gt 整数2判断整数1是否大于整数2(大于为真)

整数1 -lt 整数2判断整数1是否小于整数2(小于位置)

整数1 -ge 整数2判断整数1是否大于等于整数2(大于等于为真)

整数1 -le 整数2判断整数1是否小于等于整数2(小于等于为真)

4.5字符串的判断

测试选项作 用

-z 字符串判断字符串是否为空(为空返回真)

-n 字符串判断字符串是否为非空(非空返回真)

字串1 ==字串2判断字符串1是否和字符串2相等(相等返回真)

字串1 != 字串2判断字符串1是否和字符串2不相等(不相等返回真) 4.6多重条件判断

测试选项作 用

判断1 -a 判断2逻辑与,判断1和判断2都成立,最终的结果才为真

判断1 -o 判断2逻辑或,判断1和判断2有一个成立,最终的结果就为

!判断逻辑非,使原始的判断式取反

5流程控制


5.1 if语句

(1)单分支语句

[java] view plain copy print?

if [ 条件判断式 ];then  

程序  

fi  

单分支条件语句需要注意几个点:

 if语句使用fi结尾,和一般语言使用大括号结尾不同

 [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格

 then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了

(2)双分支语句

[java] view plain copy print?

if [ 条件判断式 ]  

then  

条件成立时,执行的程序  

else  

条件不成立时,执行的另一个程序  

fi  


例如:判断apache是否启动的脚本

[java] view plain copy print?

#!/bin/bash  

# Author: abp  

port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}')  

#使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port  

if [ "$port" == "open" ]  

then  

echo “$(date) httpd is ok!” >> /tmp/autostart-acc.log  

else  

/etc/rc.d/init.d/httpd start &>/dev/null  

echo "$(date) restart httpd !!" >> /tmp/autostart-err.log  

fi  




5.2case语句

case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

例如:

[java] view plain copy print?

case $变量名 in  

"值1")  

如果变量的值等于值1,则执行程序1  

;;  

"值2")  

如果变量的值等于值2,则执行程序2  

;;  

.......  

*)  

如果变量的值都不是以上的值,则执行此程序  

;;  

esac  



5.3 for 语句

格式1:

[java] view plain copy print?

for 变量 in 值1 值2 值3…  

do  

程序  

done  

例如:批量解压缩脚本


[java] view plain copy print?

#!/bin/bash  

#批量解压缩脚本  

# Author: abp  

cd /tomcat  

ls *.tar.gz > ls.log  

for i in $(cat ls.log)  

do  

tar -zxf $i &>/dev/null  

done  

rm -rf /lamp/ls.log  


格式2:


[java] view plain copy print?

for (( 初始值;循环控制条件;变量变化 ))  

do  

程序  

done  

例如:计算1-100的和

[java] view plain copy print?

#!/bin/bash  

#从1加到100  

# Author: abp  

s=0  

for (( i=1;i<=100;i=i+1 ))  

do  

s=$(( $s+$i ))  

done  

echo "The sum of 1+2+...+100 is : $s"  



5.4while语句

while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。

格式如下:

[java] view plain copy print?

while [ 条件判断式 ]  

do  

程序  

done  

例如:

[java] view plain copy print?

#!/bin/bash  

# Author: abp  

i=1  

s=0  

while [ $i -le 100 ]  

#如果变量i的值小于等于100,则执行循环  

do  

s=$(( $s+$i ))  

i=$(( $i+1 ))  

done  

echo "The sum is: $s"