Shell 基本要点

 Shell概述

  • shell 命令行解释器,它接收应用程序、用户命令,然后调用操作系统内核
  • Shell还是一个功能相当强大的编程语言,易于编写,易于调试、灵活性强

Shell 解析器

[maxwell@MaxwellDBA ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/ksh
/bin/rksh
/usr/bin/ksh
/usr/bin/rksh
[maxwell@MaxwellDBA ~]$ cd /bin
[maxwell@MaxwellDBA bin]$ pwd
/bin
[maxwell@MaxwellDBA bin]$ ll | grep bash
-rwxr-xr-x  1 root root     1150584 Jul 27  2021 bash
lrwxrwxrwx  1 root root          10 Jul 27  2021 bashbug -> bashbug-64
-rwxr-xr-x  1 root root        7348 Jul 27  2021 bashbug-64
lrwxrwxrwx  1 root root           4 Jul 27  2021 sh -> bash
[maxwell@MaxwellDBA bin]$ echo $SHELL
/bin/bash
[maxwell@MaxwellDBA bin]$ 

Shell脚本入门

1.脚本格式

脚本以#!/bin/bash 开头(指定解析器)

[maxwell@MaxwellDBA datas]$ ls -ltr
total 4
-rwxrwxr-x 1 maxwell maxwell 32 Oct 10 12:38 helloworld.sh
[maxwell@MaxwellDBA datas]$ ./helloworld.sh
hello world
[maxwell@MaxwellDBA datas]$ sh -x helloworld.sh 
+ echo 'hello world'
hello world
[maxwell@MaxwellDBA datas]$ bash helloworld.sh
hello world
[maxwell@MaxwellDBA datas]$ bash /home/maxwell/datas/helloworld.sh
hello world
[maxwell@MaxwellDBA datas]$ sh /home/maxwell/datas/helloworld.sh  
hello world
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ cat batch.sh
#!/bin/bash

cd /home/maxwell/
touch banzhang.txt
echo "This is MAXWELL" >> banzhang.txt
[maxwell@MaxwellDBA datas]$ 

常用系统变量

$HOME

$PWD

$SHELL

$USER

(1) 查看系统变量的值

[maxwell@MaxwellDBA datas]$ echo $HOME
/home/maxwell
[maxwell@MaxwellDBA datas]$ echo $PWD
/home/maxwell/datas
[maxwell@MaxwellDBA datas]$ echo $SHELL
/bin/bash
[maxwell@MaxwellDBA datas]$ echo $USER
maxwell
[maxwell@MaxwellDBA datas]$ 

(2)显示当前shell中所有变量: set

[maxwell@MaxwellDBA datas]$ set

自定义变量

1.基本语法

(1) 定义变量 : 变量=值

[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ A=1
[maxwell@MaxwellDBA datas]$ echo $A
1
[maxwell@MaxwellDBA datas]$ A = 2
-bash: A: command not found
[maxwell@MaxwellDBA datas]$ A=2
[maxwell@MaxwellDBA datas]$ echo $A
2
[maxwell@MaxwellDBA datas]$

(2) 撤销变量: unset 变量

[maxwell@MaxwellDBA datas]$ unset B
[maxwell@MaxwellDBA datas]$ echo $B

[maxwell@MaxwellDBA datas]$ 

(3)声明静态变量: readonly变量, 注意: 不能unset

[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ readonly B=3
[maxwell@MaxwellDBA datas]$ echo $B
3
[maxwell@MaxwellDBA datas]$ unset B
-bash: unset: B: cannot unset: readonly variable
[maxwell@MaxwellDBA datas]$ 

2.变量定义规则

(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

(2) 等号两侧下能有空格

(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

(4)变量的值如果有空格,需要使用双引号或单引号括起来。

3.案例实操

(1)定义变量A

(2)给变量A重新赋值

(3)撤销变量A

(4)声明静态的变量B=2,不能unset

 (5) 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

(6)变量的值如果有空格,需要使用双引号或单引号括起来。

(7)可以把变量提升为全局环境变量,可供其他Shell程序使用。

    export 变量名

[maxwell@MaxwellDBA datas]$ A=5
[maxwell@MaxwellDBA datas]$ echo $A
5
[maxwell@MaxwellDBA datas]$ A=8
[maxwell@MaxwellDBA datas]$ echo $A
8
[maxwell@MaxwellDBA datas]$ unset A
[maxwell@MaxwellDBA datas]$ echo $A

[maxwell@MaxwellDBA datas]$ readonly B=3
[maxwell@MaxwellDBA datas]$ echo $B
3
[maxwell@MaxwellDBA datas]$ readonly B=2
-bash: B: readonly variable
[maxwell@MaxwellDBA datas]$ echo $B
3
[maxwell@MaxwellDBA datas]$
[maxwell@MaxwellDBA datas]$ C=1+2
[maxwell@MaxwellDBA datas]$ echo $C
1+2
[maxwell@MaxwellDBA datas]$ D="I love learning Shell"  
[maxwell@MaxwellDBA datas]$ echo $D
I love learning Shell
[maxwell@MaxwellDBA datas]$ 

[maxwell@MaxwellDBA datas]$ ./helloworld.sh 
hello world

[maxwell@MaxwellDBA datas]$ export D
[maxwell@MaxwellDBA datas]$ ./helloworld.sh 
hello world
I love learning Shell
[maxwell@MaxwellDBA datas]$ 

特殊变量

$n                 $#                $*              $@                  $?

1.$n (功能描述: n为数字,$0 代表该脚本的名称, $1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含如${10})

(1)输出该脚本文件名称、输入参数1、输入参数2

2.基本语法

$#       (功能描述:获取所有输入参数个数,常用于循环)

(1)获取输入参数的个数。

[maxwell@MaxwellDBA datas]$ vim parameter.sh                   
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ chmod 777 parameter.sh
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ ./parameter.sh cls xz
./parameter.sh  cls  xz  
2
[maxwell@MaxwellDBA datas]$ vim parameter.sh
[maxwell@MaxwellDBA datas]$ cat parameter.sh 
#!/bin/bash
echo "$0  $1  $2  $3"
echo $#
[maxwell@MaxwellDBA datas]$ 

$* 、$@

1.基本语法

$*(功能描述: 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

$@(功能描述: 这个变量也代表命令行中所有的参数, 不过$@把每一个参数区分对待)

2.案例实操

[maxwell@MaxwellDBA datas]$ vim parameter.sh 
[maxwell@MaxwellDBA datas]$ cat parameter.sh 
#!/bin/bash
echo "$0  $1  $2  $3"
echo $#
echo $*
echo $@
[maxwell@MaxwellDBA datas]$ bash parameter.sh  1 2 3
parameter.sh  1  2  3
3
1 2 3
1 2 3
[maxwell@MaxwellDBA datas]$ 

特殊变量: $?

1.基本语法

$?(功能描述:最后一次执行的命令的返回状态。 如果这个变量的值为0,,证明上一个命令正确执行;如果这个变量的值为非0(具体由命令自己决定是哪个数),则证明上一个命令行不正确)

[maxwell@MaxwellDBA datas]$ ./helloworld.sh 
hello world

[maxwell@MaxwellDBA datas]$ echo $?
0
[maxwell@MaxwellDBA datas]$

运算符

1、基本语法

(1)$((运算式)) 或 $[运算式]

(2) expr +,-,\*,  /,  %  加, 减  乘  除   取余

注意: expr 运算符间要有空格

2.实操

[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ expr 2 + 3
5
[maxwell@MaxwellDBA datas]$ expr 3 - 2
1
[maxwell@MaxwellDBA datas]$ expr `expr 2 + 3` \* 4
20
[maxwell@MaxwellDBA datas]$ s=$[(2+3)*4]
[maxwell@MaxwellDBA datas]$ echo $s
20
[maxwell@MaxwellDBA datas]$

条件判断

1.基本语法

[ condition ] (注意condition前后要有空格)

注意: 条件非空即为true, [ maxwell ] 返回true, [] 返回 false

2.常用判断条件

(1)两个整数之间比较

= 字符串比较

-lt 小于 (less than)   -le   小于等于 less equal

-eq  等于 equal             -gt  大于   greater than

-ge  大于等于 (greater equal)  -ne 不等于 (Not equal)

(2) 按照 文件权限进行判断

- r 有读的权限 (read)           - w 有写的权限 (write)

-x  有执行的权限(execute)

(3) 按照文件类型进行判断

-f 文件存在并且是一个常规的文件(file)

-e 文件存在(existence)     -d 文件存在并是一个目录(directory)

[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ [23 -ge 22]
-bash: [23: command not found
[maxwell@MaxwellDBA datas]$ [ 23 -ge 22 ]
[maxwell@MaxwellDBA datas]$ echo $?
0
[maxwell@MaxwellDBA datas]$ [ 23 -le 22 ] 
[maxwell@MaxwellDBA datas]$ echo $?      
1
[maxwell@MaxwellDBA datas]$ [ -w helloworld.sh ] 
[maxwell@MaxwellDBA datas]$ echo $?             
0
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ [ -e /home/maxwell/banzhang.txt ]
[maxwell@MaxwellDBA datas]$ echo $?
0
[maxwell@MaxwellDBA datas]$ [ -e /home/maxwell/max.txt ]        
[maxwell@MaxwellDBA datas]$ echo $?
1
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ 

(4) 多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令)

[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$  [ condition ]&& echo ok || echo notok
ok
[maxwell@MaxwellDBA datas]$ [ condition ] && [ ] || echo notok
notok
[maxwell@MaxwellDBA datas]$ 

流程控制(重点)

1.if 判断

if [ 条件判断式 ];then

   程序

fi

# 或者

if [ 条件判断式 ]
  then
    程序
fi


# 注意事项:

# (1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

# (2) if 后要有空格

2. 实操

[maxwell@MaxwellDBA datas]$ touch if.sh
[maxwell@MaxwellDBA datas]$ vim if.sh 
[maxwell@MaxwellDBA datas]$ bash if.sh 
if.sh: line 3: [: -eq: unary operator expected
if.sh: line 6: [: -eq: unary operator expected
[maxwell@MaxwellDBA datas]$ bash if.sh  1
You are handsome
[maxwell@MaxwellDBA datas]$ bash if.sh  2
She is beatiful
[maxwell@MaxwellDBA datas]$ bash if.sh  3
[maxwell@MaxwellDBA datas]$ cat if.sh
#!/bin/bash

if [ $1 -eq 1 ]
then
        echo "You are handsome";
elif [ $1 -eq 2 ]
then
        echo "She is beatiful"
fi
[maxwell@MaxwellDBA datas]$ 

2.case语句

case $变量名 in

     "value 1")
        if value is equal to 1, then execute program 1

        ;;

     "value 2")
        if value is equal to 2, then execute program 2

        ;;

     "value 3")
        if value is equal to 3, then execute program 3

        ;;

    ...ignorance other branch sentence ...

    *) 

      if the variable are not belongs to all of values , then execute this program

      ;;

esac
[maxwell@MaxwellDBA datas]$ touch case.sh
[maxwell@MaxwellDBA datas]$ vi case.sh
[maxwell@MaxwellDBA datas]$ bash case.sh 1
monitor
[maxwell@MaxwellDBA datas]$ bash case.sh 2
cls
[maxwell@MaxwellDBA datas]$ bash case.sh 3
good boy
[maxwell@MaxwellDBA datas]$ bash case.sh 4
good boy
[maxwell@MaxwellDBA datas]$ cat case.sh
#!/bin/bash

case $1 in
1)
        echo "monitor"
;;
2)
        echo "cls"
;;
*)
        echo "good boy"
;;
esac
[maxwell@MaxwellDBA datas]$ 

3.for循环

1.基本语法1

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

    do

       程序
    
    done
[maxwell@MaxwellDBA datas]$ touch for1.sh
[maxwell@MaxwellDBA datas]$ vim for1.sh
[maxwell@MaxwellDBA datas]$ vim for1.sh  
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ bash for1.sh
5050
[maxwell@MaxwellDBA datas]$ cat for1.sh
#!/bin/bash

s=0
for((i=1;i<=100;i++))
do
        s=$[$s+$i]
done

echo $s
[maxwell@MaxwellDBA datas]$ 

2 基本语法2

for 变量 in value1 value2 value3...

  do

    程序

  done
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ touch for2.sh
[maxwell@MaxwellDBA datas]$ vim for2.sh
[maxwell@MaxwellDBA datas]$ bash for2.sh mm
monitor love mm
[maxwell@MaxwellDBA datas]$ bash for2.sh cls
monitor love cls
[maxwell@MaxwellDBA datas]$ bash for2.sh dog
monitor love dog
[maxwell@MaxwellDBA datas]$ bash for2.sh cat
monitor love cat
[maxwell@MaxwellDBA datas]$ cat for2.sh
#!/bin/bash

for i in $*
do
        echo "monitor love $i"
done
[maxwell@MaxwellDBA datas]$ vim for2.sh
[maxwell@MaxwellDBA datas]$ vim for2
[maxwell@MaxwellDBA datas]$ vim for2.sh 
[maxwell@MaxwellDBA datas]$ cat for2.sh
#!/bin/bash

for i in $*
do
        echo "monitor love $i"
done

for j in $@
do
        echo "Teacher love $j"
done
[maxwell@MaxwellDBA datas]$ bash for2.sh mm cls dog child
monitor love mm
monitor love cls
monitor love dog
monitor love child
Teacher love mm
Teacher love cls
Teacher love dog
Teacher love child
[maxwell@MaxwellDBA datas]$ vim for2.sh
[maxwell@MaxwellDBA datas]$ cat for2.sh                  
#!/bin/bash

for i in "$*"
do
        echo "monitor love $i"
done

for j in "$@"
do
        echo "Teacher love $j"
done
[maxwell@MaxwellDBA datas]$ bash for2.sh mm cls dog child
monitor love mm cls dog child
Teacher love mm
Teacher love cls
Teacher love dog
Teacher love child
[maxwell@MaxwellDBA datas]$ 

4.while循环

while [ 条件判断式 ]

  do
    
    程序
 done

[maxwell@MaxwellDBA datas]$ touch while.sh
[maxwell@MaxwellDBA datas]$ vim while.sh
[maxwell@MaxwellDBA datas]$ cat while.sh
#!/bin/bash

s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s + $i]
        i=$[$i + 1]
done

echo $s
[maxwell@MaxwellDBA datas]$ bash while.sh
5050
[maxwell@MaxwellDBA datas]$ 

read读取控制台输入

1.基本语法

read(选项)(参数)

选项:

-p: 指定读取值时的提示符;

-t: 指定读取值时等待的时间(秒)。

参数

       变量: 指定读取值的变量名

2.案例实操

(1)提示7秒内,读取控制台输入的名称

[maxwell@MaxwellDBA datas]$ touch read.sh
[maxwell@MaxwellDBA datas]$ vim read.sh
[maxwell@MaxwellDBA datas]$ ./read.sh  
-bash: ./read.sh: Permission denied
[maxwell@MaxwellDBA datas]$ chmod 775 read.sh    
[maxwell@MaxwellDBA datas]$ ./read.sh  
Enter your name in 7 seconds Maxwell
Maxwell
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ cat read.sh
#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME

[maxwell@MaxwellDBA datas]$ 

函数

系统函数

1.basename 基本语法

basename [string/pathname][suffix] (功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。)

选项:

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

2.案例

(1)截取/home/maxwell/banzhang.txt 路径的文件名称

[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ basename /home/maxwell/banzhang.txt 
banzhang.txt
[maxwell@MaxwellDBA datas]$ basename /home/maxwell/banzhang.txt .txt
banzhang
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ basename /home/maxwell/datas/batch.sh
batch.sh
[maxwell@MaxwellDBA datas]$ basename /home/maxwell/datas/for2.sh
for2.sh
[maxwell@MaxwellDBA datas]$ basename /home/maxwell/datas/for2.sh .sh
for2
[maxwell@MaxwellDBA datas]$ 

3.dirname基本语法

dirname 文件绝对路径(功能描述,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的(目录的部分))

[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ dirname /home/maxwell/datas/batch.sh
/home/maxwell/datas
[maxwell@MaxwellDBA datas]$ dirname /home/maxwell/banzhang.txt 
/home/maxwell
[maxwell@MaxwellDBA datas]$

自定义函数

1.基本语法

[ function ] funname[()]
{
    Action;
    [return int;]
}
funname

2.经验技巧

(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

(2) 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值n(0-255)

3.案例实操

[maxwell@MaxwellDBA datas]$ vim sum.sh   
[maxwell@MaxwellDBA datas]$ bash sum.sh
Please input the number1: 2
Please input the number2: 5
7
[maxwell@MaxwellDBA datas]$ cat sum.sh 
#!/bin/bash
function sum()
{
   s=0;
   s=$[ $1 + $2 ]
   echo "$s"
}

read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
[maxwell@MaxwellDBA datas]$ 

Shell工具(重点)

1. Cut

cut的工作就是"剪",具体的说就是在文件中负责剪切数据用的.cut命令从文件的每一行剪切字节,字符和字段并将这些字节、字符和字段输出。

1.基本用法

cut[选项参数] filename

说明:默认分隔符是制表符

2.选项参数说明

选项参数功能
-f列号,提取第几列
-d

分隔符,按照指定分隔符分割列

3.实操

[maxwell@MaxwellDBA datas]$ touch cut.txt
[maxwell@MaxwellDBA datas]$ vim cut.txt
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ cat cut.txt
dong  shen
guan  zhen
wo  wo
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
[maxwell@MaxwellDBA datas]$ cut -d " " -f 2,3 cut.txt
 shen
 zhen
 wo
 lai
 le
[maxwell@MaxwellDBA datas]$ vim cut.txt              
[maxwell@MaxwellDBA datas]$ cut -d " " -f 2,3 cut.txt
shen
zhen
 wo
 lai
 le
[maxwell@MaxwellDBA datas]$ cut -d " " -f 1 cut.txt                
dong
guan
wo
lai
le
[maxwell@MaxwellDBA datas]$ cut -d " " -f 2 cut.txt  
shen
zhen



[maxwell@MaxwellDBA datas]$ cat cut.txt                            
dong shen
guan zhen
wo  wo
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ cat cut.txt | grep guan
guan zhen
[maxwell@MaxwellDBA datas]$ cat cut.txt | grep guan | cut -d " " -f 1
guan
[maxwell@MaxwellDBA datas]$ echo $PATH
/home/maxwell/.local/bin:/home/maxwell/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
[maxwell@MaxwellDBA datas]$ echo $PATH | cut -d : -f 3- 
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
[maxwell@MaxwellDBA datas]$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.5.177  netmask 255.255.192.0  broadcast 172.26.63.255
        inet6 fe80::216:3eff:fe0f:18f3  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:0f:18:f3  txqueuelen 1000  (Ethernet)
        RX packets 990059  bytes 239781810 (228.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 794636  bytes 225620774 (215.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1637413  bytes 282918393 (269.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1637413  bytes 282918393 (269.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[maxwell@MaxwellDBA datas]$ ifconfig  eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.5.177  netmask 255.255.192.0  broadcast 172.26.63.255
        inet6 fe80::216:3eff:fe0f:18f3  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:0f:18:f3  txqueuelen 1000  (Ethernet)
        RX packets 990153  bytes 239790332 (228.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 794700  bytes 225634216 (215.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[maxwell@MaxwellDBA datas]$ ifconfig  eth0 | grep "inet" 
        inet 172.26.5.177  netmask 255.255.192.0  broadcast 172.26.63.255
        inet6 fe80::216:3eff:fe0f:18f3  prefixlen 64  scopeid 0x20<link>
[maxwell@MaxwellDBA datas]$ ifconfig  eth0 | grep "inet "
        inet 172.26.5.177  netmask 255.255.192.0  broadcast 172.26.63.255

2.sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变。除非你使用重定向存储输出。

1.基本用法

sed [选项参数] ‘command’ filename

2.选项参数说明

选项参数

功能

-e直接在指令列模式上进行sed的动作编辑

3.命令功能描述

命令功能描述
a新增(add),a的后面可以接字串,在下一行出现
d删除(delete)
s查找并替换
[maxwell@MaxwellDBA datas]$ ls -ltr
total 44
-rw-rw-r-- 1 maxwell maxwell  89 Oct 10 12:46 batch.sh
-rwxrwxr-x 1 maxwell maxwell  41 Oct 10 13:14 helloworld.sh
-rwxrwxrwx 1 maxwell maxwell  58 Oct 10 14:36 parameter.sh
-rw-rw-r-- 1 maxwell maxwell 110 Oct 10 15:22 if.sh
-rw-rw-r-- 1 maxwell maxwell  92 Oct 10 15:34 case.sh
-rw-rw-r-- 1 maxwell maxwell  68 Oct 10 15:47 for1.sh
-rw-rw-r-- 1 maxwell maxwell 106 Oct 10 15:56 for2.sh
-rw-rw-r-- 1 maxwell maxwell  86 Oct 10 16:12 while.sh
-rwxrwxr-x 1 maxwell maxwell  75 Oct 10 16:26 read.sh
-rwxrwxrwx 1 maxwell maxwell 166 Oct 10 17:04 sum.sh
-rw-rw-r-- 1 maxwell maxwell  43 Oct 10 18:58 cut.txt
[maxwell@MaxwellDBA datas]$ cp -p cut.txt sed.txt
[maxwell@MaxwellDBA datas]$ vim sed.txt
[maxwell@MaxwellDBA datas]$ ls -ltr
total 48
-rw-rw-r-- 1 maxwell maxwell  89 Oct 10 12:46 batch.sh
-rwxrwxr-x 1 maxwell maxwell  41 Oct 10 13:14 helloworld.sh
-rwxrwxrwx 1 maxwell maxwell  58 Oct 10 14:36 parameter.sh
-rw-rw-r-- 1 maxwell maxwell 110 Oct 10 15:22 if.sh
-rw-rw-r-- 1 maxwell maxwell  92 Oct 10 15:34 case.sh
-rw-rw-r-- 1 maxwell maxwell  68 Oct 10 15:47 for1.sh
-rw-rw-r-- 1 maxwell maxwell 106 Oct 10 15:56 for2.sh
-rw-rw-r-- 1 maxwell maxwell  86 Oct 10 16:12 while.sh
-rwxrwxr-x 1 maxwell maxwell  75 Oct 10 16:26 read.sh
-rwxrwxrwx 1 maxwell maxwell 166 Oct 10 17:04 sum.sh
-rw-rw-r-- 1 maxwell maxwell  43 Oct 10 18:58 sed.txt
-rw-rw-r-- 1 maxwell maxwell  43 Oct 10 18:58 cut.txt
[maxwell@MaxwellDBA datas]$ cat sed.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ sed  "2a mei nv" sed.txt
dong shen
guan zhen
mei nv
wo  wo
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ cat sed.txt             
dong shen
guan zhen
wo  wo
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ sed "/wo/d" sed.txt 
dong shen
guan zhen
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ cat sed.txt         
dong shen
guan zhen
wo  wo
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ sed "s/wo/ni/g" sed.txt 
dong shen
guan zhen
ni  ni
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ cat sed.txt             
dong shen
guan zhen
wo  wo
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ sed -e "2d" -e "s/wo/ni/g" sed.txt 
dong shen
ni  ni
lai  lai
le  le
[maxwell@MaxwellDBA datas]$ 

3.awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

1.基本用法

awk [选项参数] ‘pattern{action1}  pattern{action2}...’ filename

pattern: 表示AWK 在数据中查找的内容,就是匹配模式

action: 在找到匹配内容时所执行的一系列命令。

2.选项参数说明

选项参数功能
-F指定输入文件拆分隔符
-V赋值一个用户定义变量

3.实操

[maxwell@MaxwellDBA datas]$ pwd
/home/maxwell/datas
[maxwell@MaxwellDBA datas]$ cat 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:997:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
unbound:x:996:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
setroubleshoot:x:995:991::/var/lib/setroubleshoot:/sbin/nologin
cockpit-ws:x:994:990:User for cockpit web service:/nonexisting:/sbin/nologin
cockpit-wsinstance:x:993:989:User for cockpit-ws instances:/nonexisting:/sbin/nologin
sssd:x:992:988:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:991:987::/var/lib/chrony:/sbin/nologin
rngd:x:990:986:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
admin:x:1000:1000::/home/admin:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
oracle:x:54321:54321::/home/oracle:/bin/bash
maxwell:x:54322:54331::/home/maxwell:/bin/bash
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
db2fenc1:x:54324:54333::/home/db2fenc1:/bin/bash
db2inst1:x:54325:54334::/home/db2inst1:/bin/bash
db2iadm1:x:54326:54335::/home/db2iadm1:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
[maxwell@MaxwellDBA datas]$ awk  -F : '/^root/ {print $7}' passwd
/bin/bash
[maxwell@MaxwellDBA datas]$ cat 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:997:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
unbound:x:996:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
setroubleshoot:x:995:991::/var/lib/setroubleshoot:/sbin/nologin
cockpit-ws:x:994:990:User for cockpit web service:/nonexisting:/sbin/nologin
cockpit-wsinstance:x:993:989:User for cockpit-ws instances:/nonexisting:/sbin/nologin
sssd:x:992:988:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:991:987::/var/lib/chrony:/sbin/nologin
rngd:x:990:986:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
admin:x:1000:1000::/home/admin:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
oracle:x:54321:54321::/home/oracle:/bin/bash
maxwell:x:54322:54331::/home/maxwell:/bin/bash
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
db2fenc1:x:54324:54333::/home/db2fenc1:/bin/bash
db2inst1:x:54325:54334::/home/db2inst1:/bin/bash
db2iadm1:x:54326:54335::/home/db2iadm1:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
[maxwell@MaxwellDBA datas]$ awk  -F : '/^root/ {print $1","$7}' passwd
root,/bin/bash
[maxwell@MaxwellDBA datas]$ awk  -F : 'BEGIN{print "user,shell"} {print $1","$7} END {print "dahaige, bin/zuishuai"}' passwd
user,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
sync,/bin/sync
shutdown,/sbin/shutdown
halt,/sbin/halt
mail,/sbin/nologin
operator,/sbin/nologin
games,/sbin/nologin
ftp,/sbin/nologin
nobody,/sbin/nologin
dbus,/sbin/nologin
systemd-coredump,/sbin/nologin
systemd-resolve,/sbin/nologin
tss,/sbin/nologin
polkitd,/sbin/nologin
libstoragemgmt,/sbin/nologin
unbound,/sbin/nologin
setroubleshoot,/sbin/nologin
cockpit-ws,/sbin/nologin
cockpit-wsinstance,/sbin/nologin
sssd,/sbin/nologin
sshd,/sbin/nologin
chrony,/sbin/nologin
rngd,/sbin/nologin
tcpdump,/sbin/nologin
nscd,/sbin/nologin
admin,/bin/bash
rpc,/sbin/nologin
rpcuser,/sbin/nologin
oracle,/bin/bash
maxwell,/bin/bash
postgres,/bin/bash
db2fenc1,/bin/bash
db2inst1,/bin/bash
db2iadm1,/bin/bash
mysql,/sbin/nologin
dahaige, bin/zuishuai
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ awk  -F : -v i=1 '{print $3+i}' passwd 
1
2
3
4
5
6
7
8
9
12
13
15
65535
82
1000
194
60
999
998
997
996
995
994
993
75
992
991
73
29
1001
33
30
54322
54323
27
54325
54326
54327
28
[maxwell@MaxwellDBA datas]$ cat 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:997:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
unbound:x:996:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
setroubleshoot:x:995:991::/var/lib/setroubleshoot:/sbin/nologin
cockpit-ws:x:994:990:User for cockpit web service:/nonexisting:/sbin/nologin
cockpit-wsinstance:x:993:989:User for cockpit-ws instances:/nonexisting:/sbin/nologin
sssd:x:992:988:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:991:987::/var/lib/chrony:/sbin/nologin
rngd:x:990:986:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
admin:x:1000:1000::/home/admin:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
oracle:x:54321:54321::/home/oracle:/bin/bash
maxwell:x:54322:54331::/home/maxwell:/bin/bash
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
db2fenc1:x:54324:54333::/home/db2fenc1:/bin/bash
db2inst1:x:54325:54334::/home/db2inst1:/bin/bash
db2iadm1:x:54326:54335::/home/db2iadm1:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
[maxwell@MaxwellDBA datas]$ 

4.awk的内置变量

变量说明
FILENAME

文件名

NR已读的记录数
NF

浏览记录的域的个数(切割后,列的个数)

5.案例实操

(1)统计passwd文件名,每行的行号,每行的列数。

(2)切割ip

  (3)查询sed.txt中空行所在的行号

[maxwell@MaxwellDBA datas]$ awk  -F : '{print FILENAME NR NF}' passwd            
passwd17
passwd27
passwd37
passwd47
passwd57
passwd67
passwd77
passwd87
passwd97
passwd107
passwd117
passwd127
passwd137
passwd147
passwd157
passwd167
passwd177
passwd187
passwd197
passwd207
passwd217
passwd227
passwd237
passwd247
passwd257
passwd267
passwd277
passwd287
passwd297
passwd307
passwd317
passwd327
passwd337
passwd347
passwd357
passwd367
passwd377
passwd387
passwd397
[maxwell@MaxwellDBA datas]$ awk  -F : '{print FILENAME "," NR"," NF}' passwd
passwd,1,7
passwd,2,7
passwd,3,7
passwd,4,7
passwd,5,7
passwd,6,7
passwd,7,7
passwd,8,7
passwd,9,7
passwd,10,7
passwd,11,7
passwd,12,7
passwd,13,7
passwd,14,7
passwd,15,7
passwd,16,7
passwd,17,7
passwd,18,7
passwd,19,7
passwd,20,7
passwd,21,7
passwd,22,7
passwd,23,7
passwd,24,7
passwd,25,7
passwd,26,7
passwd,27,7
passwd,28,7
passwd,29,7
passwd,30,7
passwd,31,7
passwd,32,7
passwd,33,7
passwd,34,7
passwd,35,7
passwd,36,7
passwd,37,7
passwd,38,7
passwd,39,7
[maxwell@MaxwellDBA datas]$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.5.177  netmask 255.255.192.0  broadcast 172.26.63.255
        inet6 fe80::216:3eff:fe0f:18f3  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:0f:18:f3  txqueuelen 1000  (Ethernet)
        RX packets 998008  bytes 240602844 (229.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 800042  bytes 226949295 (216.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1638155  bytes 282971097 (269.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1638155  bytes 282971097 (269.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[maxwell@MaxwellDBA datas]$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.5.177  netmask 255.255.192.0  broadcast 172.26.63.255
        inet6 fe80::216:3eff:fe0f:18f3  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:0f:18:f3  txqueuelen 1000  (Ethernet)
        RX packets 998033  bytes 240605082 (229.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 800059  bytes 226956081 (216.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[maxwell@MaxwellDBA datas]$ ifconfig eth0 | grep "inet "
        inet 172.26.5.177  netmask 255.255.192.0  broadcast 172.26.63.255

4.sort

sort 命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

1.基本语法

sort(选项)(参数)

选项说明
-n依照数值的大小排序
-r以相反的顺序来排序
-t设置排序时所用的分割字符
-k指定需要排序的列

参数:指定待排序的文件列表

2.案例实操

[maxwell@MaxwellDBA datas]$ touch sort.sh
[maxwell@MaxwellDBA datas]$ vim sort.sh
[maxwell@MaxwellDBA datas]$ sort -t : -nrk 3 sort.sh
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6
[maxwell@MaxwellDBA datas]$ cat sort.sh 
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
[maxwell@MaxwellDBA datas]$ sort -t : -nrk 2 sort.sh
xz:50:2.3
bb:40:5.4
ss:30:1.6
bd:20:4.2
cls:10:3.5
[maxwell@MaxwellDBA datas]$ 

企业真实面试题

京东

问题1: 使用Linux 命令查询file中空行所在的行号

[maxwell@MaxwellDBA datas]$ awk '/^$/ {print NR}' sed.txt
5
[maxwell@MaxwellDBA datas]$ cat sed.txt 
dong shen
guan zhen
wo  wo
lai  lai

le  le
[maxwell@MaxwellDBA datas]$ 

问题2: 有文件chengji.txt内容如下:

张三 40

李四 50

王五 60

使用Linux命令计算第二列的和并输出

[maxwell@MaxwellDBA datas]$ vim chengji.txt
[maxwell@MaxwellDBA datas]$ 
[maxwell@MaxwellDBA datas]$ cat chengji.txt | awk -F " " '{sum+=$2} END{print sum} '        
150
[maxwell@MaxwellDBA datas]$ cat chengji.txt
张三 40
李四 50
王五 60
[maxwell@MaxwellDBA datas]$ 

2.搜狐和腾讯

shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?

#!/bin/bash

if [ -f file.txt ]; then
  echo "文件存在!"
else
  echo "文件不存在!"
fi

3.新浪

问题1: 用shell写一个脚本,对文本中无序的一列数字进行排序

[maxwell@MaxwellDBA datas]$ vim test.txt
[maxwell@MaxwellDBA datas]$ cat test.txt
9
6
5
4
8
7
3
2
10
1
[maxwell@MaxwellDBA datas]$ sort -n test.txt 
1
2
3
4
5
6
7
8
9
10
[maxwell@MaxwellDBA datas]$ sort -n test.txt | awk '{a+=$0;print$0}END{print "SUM="a}'
1
2
3
4
5
6
7
8
9
10
SUM=55
[maxwell@MaxwellDBA datas]$ 

金和网络

问题1:请用shell脚本写出查找当前文件夹/home下所有文本文件内容中包含有字符“shen”的文件名称

[maxwell@MaxwellDBA datas]$ grep -r "shen" /home | cut -d ":" -f 1
grep: /home/admin: Permission denied
grep: /home/oracle: Permission denied
/home/maxwell/datas/cut.txt
/home/maxwell/datas/sed.txt

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值