Linux常用命令总结(三)vim/正则表达式/shell script/


一、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时,会同时存在三种变量:

  1. 局部变量

    局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

  2. 环境变量

    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

  3. 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语句格式如下:

casein
模式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也使用 breakcontinue 来跳出循环。

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特殊变量。

$? 函数的返回值。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值