当前位置首页 > Linux知识

LinuxShell编程

阅读次数:247 次  来源:admin  发布时间:

一,基础正则表达式

1,正则表达式与通配符

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

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

2,基础正则表达式

表达式 含义 ^ ^word表示匹配以word开头的内容(打印的是一行内容),vi/vim 编辑器里^代表一行的开头 $ word$表示匹配word结尾的内容(打印的是一行内容),vi/vim编辑器里$代表一行的结尾 ^$ 表示空行 . 代表且只能代表任意一个字符 \ \.就只代表点本身,转义符号,让有着特殊身份意义的字符,脱掉马甲,还原原形 * 重复0个或多个前面一个字符,例如:0*,有1个0或多个000000 .* 匹配所有字符,延伸^.*以任意多个字符开头,.*$以任意多个字符结尾 [abc] 匹配字符集合内的任意一个字符[a-zA-Z],[0-9](单个字符而不是包含的单词) [^abc] 匹配不包含^后的任意一个字符的内容(单个字符而不是包含的单词);其中括号里^为取反,注意和中括号内以^开头区别 a\{n,m\}

重复n到m次,前一个重复的字符,如果用egrep/sed -r可以去掉斜线;

例子:gerp "0\{3,4\}" syz.log 意思为,0匹配,3-4次

my qq name is 49000448

ot 490000048

a\{n,\} 重复至少n次,前一个重复的字符,如果用egrep/sed -r 可以去到斜线 a\{n\}

重复n次,前一个重复的字符,如果用egrep/sed -r 可以去掉斜线

例子:gerp "0\{3\}" syz.log 意思为,0匹配,3次

my qq name is 49000448

a\{,m\}

????Centos5不能用,Centos6、7可以用

例子:gerp "0\{3\}" syz.log 意思为,0匹配,3次

my qq name is 49000448

二,字符截取命令

1,cut字段提取命令 (提取符合条件的列)

cut 【选项】文件名 (一般cut 和 grep 配合使用)

选项:

-f 列号:提取第几列

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

2,printf 命令

rintf '输出类型输出格式' 输出内容

输出类型:

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

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

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

hint :在$()中,()执行的内容是一条系统命令

在awk命令的输出中支持print 和 printf命令

1,print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)

2,printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

3,awk命令

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

条件(pattern):

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

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

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

x<=10判断x变量是否小于10

动作(Action):

格式化输出

流程控制语句

例如:

awk '{printf $2 "\t" $6 "\n"}' student.txt

df -h | awk '{print $1 "\t" $3}'

hint :print 会自动加换行符

因为cut命令是使用制表符\t来进行分割的,当列分割使用的是空格的时候,想要分割得到列我们就需要使用到awk

例如:

df -h | grep "sda" | awk '{printf $5 "\n" } | cut -d "%" -f 1

awk中的BEGIN

awk ‘ BEGIN {printf "This is a transcript \n"} {printf $2 "\t" $6 "\n"} ’ student.txt

会在处理分割之前先输出一行This is a transcript

awk的FS内置变量 (定义分隔符)

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

hint:awk处理时是先读入第一行数据再进行处理

awk中的END(与BEGIN相对,在所有数据处理完后执行)

awk 'END {printf "The End \n"}{printf $2 "\t" $6 "\n"}' student.txt

awk中的关系运算符:

cat student.txt | grep -v Name | awk '$6>=87 {printf $2 "\n"}'

4,sed命令

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

ed【选项】'动作' 文件名

选项:

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

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

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

动作:

a\:追加

c\:行替换

i\:插入

d:删除

:打印

:字串替换

例如:

ed -n '2p' student.txt

df -h | sed -n '2p'

ed '2,4d' student.txt

ed '2a zuobi' student.txt  追加在行末

ed '2c No much person' student.txt  数据替换

字符串替换

ed 's/旧字符串/新字符串/g' 文件名

ed '3s/74/99/g' student.txt

三,字符处理命令:

1,排序命令 sort

ort 【选项】文件名

选项:

-f  忽略大小写

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

-r  反向排序

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

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

ort -n -t ":" -k 3,3 /etc/passwd

2,统计命令 wc

wc【选项】文件名

选项:

-l 只统计行数

-w 只统计单词数

-m 只统计字符数

四,条件判断

1,按照文件类型进行判断

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

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

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

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

例如:

test -e student.txt

echo $?

[ -e student.txt]

[ -d /root ] && echo "yes" || echo "no"

2,按照文件权限进行判断

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

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

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

test -w student.txt && echo "yes" || echo "no"

3,两个文件之间进行比较

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

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

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

4,两个整数之间的比较

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

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

5,字符串判断

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

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

字符串1 == 字符串2  判断字符串是否相等

字符串1 != 字符串2  判断字符串是否不等

6,多重条件判断

判断1 -a 判断2  逻辑与,判断1和判断2都成立,为真

判断1 -o 判断2  逻辑或,判断1和判断2其一成立,为真

!判断  逻辑非,判断为假的时候 ,!判断为真

五,流程控制

1,if语句

1,单分支if条件语句

if 【条件判断式】;the

程序

fi

或者

if 【条件判断式】

the

程序

fi

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

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

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

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

判断分区使用率

#!/bin/bash

rate=$( df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)

if [ $rate -ge 80 ];the

echo "warning ! /dev/sda1 is full!"

if

echo "check end"

2,双分支if条件语句

if【条件判断式】

the

条件成立时执行的程序

else

条件不成立时执行的程序

fi

3,多分支if条件语句

if 【条件判断式1】

the

当条件判断式1成立时执行程序1

elif【条件判断式2】

the

当条件判断式2成立时执行程序2

else

当所有条件不成立时,最后执行此程序

fi

2,case语句

多分支case条件语句

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

case $变量名 i

"值1")

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

"值2")

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

*)

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

esac

3,for循环

语法一:

for 变量 in 值1 值2 值3

do

程序

done

语法二:

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

do

程序

done

4,while循环与until循环

1,while循环

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

while 【条件判断式】

do

程序

done

2,until 循环

until循环和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环

until 【条件判断式】

do

程序

done

上一篇:linux上安装mysql,tomcat,jdk
下一篇:IIS6伪静态IIS文件类型映射配置方法【图解】