文章目录
一、Vim编辑器
1.一般指令模式、编辑模式、指令列模式
使用vim指令打开一个文件直接进入一般指令模式,此模式下可以上下左右移动光标,也可以使用删除字符、删除整列、复制、粘贴等处理数据;
一般指令模式下按下i、I、o、O、a、A、r、R
中任意一个字符时,即进入编辑模式下,此时可以编辑文档,要想退出到一般指令模式需要按下ESC
按钮;
在一般指令模式下,按:、/、?
三个中任意一个按钮,即可切入到指令列命令模式,此时可以提供查询字符、保存文档、退出文档等功能。
2.一般指令列下常用按钮说明
-
移动光标方法
-
搜寻与取代
-
删除、复制与粘贴
3.一般指令列模式切换到编辑模式
4.一般指令模式切换到指令列模式
5. vim的额外功能
-
区块选择
例:如何选择长方形区域数据
将光标移动到host的h上头,然后按下ctrl+v
将光标移动到底部,此时光标移动过的区域会反白
然后按下y来复制,按下p来粘贴。 -
多文件编辑
vim命令后同时接多个文件名,则可以同时打开多个文件。
vim filename1 filename2 ...
-
多窗口功能
6.vim的环境设定:~/.vimrc
二. 正则表达式
1.基础正则表示法
[:alnum:] 代表英文大小写字符及数字,亦即0-9、A-Z、a-z
[:alpha:] 代表任何英文大小写字符,即a-z、A-Z
[:digit:] 代表数字,即0-9
[:upper:] 代表大写字符,A-Z
[:lower:] 代表小写字符,即a-z
2.基础正则表示法字符汇总
3.正则表达三剑客——grep工具
作用: 根据查询的内容, 只要当前行满足了’查询内容’就显示出来, 匹配正确的标红显示
- grep格式
- 位置确定
^关键字:行首锚定
关键字$:行尾锚定
^$:匹配空白行
\<关键字:词首锚定
关键字 \>: 词尾锚定
- 范例
grep root passwd 过滤出含有root的行
grep ^root passwd 过滤出root的首行
grep root$ passwd 过滤出root结尾的行
grep -E "root|ROOT" passwd 过滤出含有root/ROOT的行
grep -Ei root passwd 不区分大小写 过滤出含有root的行
grep ROOT passwd -n2 ##过滤出含有ROOT的行及其上下各2行且标明行号
grep ROOT passwd -1 ##过滤出含有ROOT的行及其上下各一行
grep ROOT passwd -A1 ##过滤出含有ROOT的行及其下一行
grep ROOT passwd -1 ##过滤出含有ROOT的行及其上一行
grep -i root passwd -v(反向过滤,-i为不区分大小写)
grep xy westos
grep x.y westos ##点匹配到任意字符
grep x..y westos
grep x...y westos
4.正则表达三剑客——sed工具
作用:可以对数据进行取代、删除、新增、截取特定行等操作
-
命令格式
sed [选项] AddressCommand file
-
选项
-n:静默模式(不显示模式空间)-i:直接修改原文件
-e:多点编辑,也就是实现多个行为。
-f:从指定文件中读取编辑脚本
-r:扩展表达式
-
Address:地址定界
Address,地址定界,也就是对什么范围进行操作,如果不指定地址,则对全文进行处理。
1、StartLine,EndLine
例如,从1到5行:1,5
从1到最后一行:1,$
2、/RegEXP/
正则表达式,如:/^root/
3、/patten1/,/patten2/
第1次被patten1匹配到的行开始到第1次被patten2匹配到的行结束,这中间的所有行
4、LineNumber:指定的行,第某行
5、StartLine,+N:从StartLine开始,向后的N行(共N+1行)
•Command:处理命令
d:删除符合条件的行
p:打印符合条件的行
!:取反
h:把模式空间的内容覆盖至保存空间中
H:把模式空间的内容追加至保存空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出数据追加至模式空间
x:把模式空间的内容与保持空间中的内容互换
n:读取匹配到的行的下一行至模式空间中
N:追加匹配到的行的下一行至模式空间中
D:删除多行模式空间中的所有行
n;p:打印偶数行
n;d:打印奇数行
a \string:在符合(指定行)后面追加新行,内容为string
i \string:在符合(指定行)前面追加新行,内容为string
- 内容替换
sed [选项] ‘s/str1/str2/g|i’文件
s:替换
g:全局替换,如果不写,则替换第一个匹配到的内容
i:不区分大小写 - 例子
5.正则表达三剑客——awk工具
作用:常用作一整个行的处理,将一行分成若干字段
- 命令格式
- 例子
在/etc/passwd中是以:作为字段分隔符,该文件中第一个字段为账号,第三个字段为UID,下面为查询第三栏小于10以下的数据,并且仅显示出账号与第三栏:
5.文本比对工具:diff/patch
- diff
用于对比两个文件差距。
- patch
patch与diff有密不可分的关系,diff可以用来区分两个文件差异,并且可以将差异制作成补丁文档,然后patch可以基于补丁文档升级旧的文件。
例子:
三、shell script
1.什么是shell script
shell script是利用shell的功能所写的一个“程序”(program), 这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令和数据流重定向等功能,以达到我们想要的处理目的。
shell script编写中的注意事项:
1、命令的执行是从上到下,从左到右地分析执行
2、命令与参数间的多个空格都会被忽略
3、空白行也将被忽略,并且【tab】键所得的空白同样视为空格
4、如果读取到一个Enter符号(CR),就尝试开始执行改行(或该串)命令
5、可以使用“\[Enter]”来扩展至下一行
6、#号可作为注释,任何加在#后面的数据将全部被视为批注文件而被忽略(我觉得#!/bin/bash不是)
编写第一个script:
#!/bin/bash
# print "Hello World!"
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \n"
exit 0
1、文件开头指定一个或多个解释脚本程序的shell,如#!/bin/bash
-
如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。
-
不指定的话一般默认以/bin/sh执行shell脚本
2、常见的两种执行shell script方式(文件需要有rx属性)
sh filename
./filename
2.变量
运行shell时,会同时存在三种变量:
-
局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
-
环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
-
shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行.
变量的定义:
定义变量时,变量名不加美元符号($),如:
variableName=“value”
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
• 首个字符必须为字母(a-z,A-Z)。
• 中间不能有空格,可以使用下划线(_)。
• 不能使用标点符号。
• 不能使用bash里的关键字(可用help命令查看保留关键字)。
变量定义举例
mywork="/home/chenht/share/linux"
myNum=100
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:
name=“zhiwei”
echo $name
echo ${name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
重新定义变量
已定义的变量,可以被重新定义,如:
mywork="/home/yinzw/share/linux"
echo ${mywork}
这样写是合法的,但注意,第二次赋值的时候不能写 $mywork="/home/yinzw/share/linux" , 使用变量的时候才加美元符($)。
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
mywork="/home/yinzw/share/linux"
readonly mywork
mywork="/home/yinzw/share"
运行脚本,结果如下:
/bin/sh: NAME: This variable is read only.
删除变量
使用 unset 命令可以删除变量。语法:
unset variableName
变量被删除后不能再次使用;unset 命令不能删除只读变量。
举个例子:
#!/bin/sh
mywork="/home/yinzw/share"
unset mywork
echo $mywork
上面的脚本没有任何输出。
shell 特殊变量:
前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。
特殊变量列表
变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
3.命令行参数
运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
#!/bin/bash
echo “File Name: $0”
echo “First Parameter : $1”
echo “First Parameter : $2”
echo “Quoted Values: $@”
echo “Quoted Values: $*”
echo “Total Number of Parameters : $#”
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。
但是当它们被双引号(" “)包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n " 的 形 式 输 出 所 有 参 数 ; " n"的形式输出所有参数;" n"的形式输出所有参数;"@" 会将各个参数分开,以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。
退出状态
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。
退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。
Shell替换:
Shell运算符
Shell注释
Shell字符串
Shell数组
Shell echo命令
echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串。命令格式:
显示转义字符
echo ““It is a test””
结果将是:“It is a test”
双引号也可以省略。
显示变量
name=“OK”
echo “$name It is a test”
结果将是:OK It is a test
同样双引号也可以省略。
如果变量与其它字符相连的话,需要使用大括号({ }):
mouth=6
echo "${mouth}-1-2009"结果将是:
6-1-2009
显示换行
echo “OK\n”
echo “It is a test”
输出: OK
It is a test
显示不换行
echo “OK\c”
echo “It is a test”
输出:OK It is a test
显示结果重定向至文件
echo “It is a test” > myfile原样输出字符串
若需要原样输出字符串(不进行转义),请使用单引号。例如:
echo '$name"'显示命令执行结果
echo date
结果将显示当前日期
4.判断语句
if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if … else 语句:
if … fi 语句;
if … else … fi 语句;
if … elif … else … fi 语句。
if … else 语句
if … else 语句的语法:
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。
最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。
注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。
举个例子:
#!/bin/sh
a=10
b=20
if [ $a == $b ]; then
echo “a is equal to b”
fi
if [ $a != $b ]; then
echo “a is not equal to b”
fi
运行结果: a is not equal to b
if … else … fi 语句
if … else … fi 语句的语法:
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。
if … elif … fi 语句
if … elif … fi 语句可以对多个条件进行判断
- case esac语句
case … esac 与其他语言中的 switch … case 语句类似,是一种多分枝选择结构。
case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
下面的脚本提示输入1到4,与每一种模式进行匹配:
echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
3) echo 'You select 3'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
5.循环
- for循环
与其他编程语言类似,Shell支持for循环。(注意for后面变量名没有$)
for循环一般格式为:
for 变量 in 列表
do
command1
command2
..
commandN
done
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。
例如,顺序输出当前列表中的数字:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
运行结果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
顺序输出字符串中的字符:
for str in 'This is a string'
do
echo $str
done运行结果:
This is a string
显示主目录下以 .bash 开头的文件:
#!/bin/bash
for FILE in $HOME/.bash*
do
echo $FILE
done运行结果:
/root/.bash_history
/root/.bash_logout
/root/.bash_profile
/root/.bashrc
- while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while command
do
Statement(s) to be executed if command is true
done
命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。
以下是一个基本的while循环,测试条件是:如果COUNTER小于5,那么返回 true。COUNTER从0开始,每次循环处理时,COUNTER加1。运行上述脚本,返回数字1到5,然后终止。
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER='expr $COUNTER+1'
echo $COUNTER
done
运行脚本,输出:
1
2
3
4
5
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。
echo 'type <CTRL-D> to terminate'
while read FILM
do
echo "Yeah! great film the $FILM"
done
运行脚本,输出类似下面:
type <CTRL-D> to terminate
enter your most liked film: Sound of Music
Yeah! great film the Sound of Music
- until循环
until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。
until 循环格式为:
until command
do
Statement(s) to be executed until command is true
done
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
- 跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环。
6.函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。
Shell 函数的定义格式如下:
function_name () {
list of commands
[ return value ]
}
如果你愿意,也可以在函数名前加上关键字 function:
function function_name () {
list of commands
[ return value ]
}
函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:“numeric argument required”。
如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。
先来看一个例子:
另外,还有几个特殊变量用来处理参数,前面已经提到:
特殊变量 说明
$# 传递给函数的参数个数。
$* 显示所有传递给函数的参数。
@ 与 @ 与 @与*相同,但是略有区别,请查看Shell特殊变量。
$? 函数的返回值。