linux常用基本命令

# 文本与文本查找

## 1.grep

常用参数:

-A n --after-context显示匹配字符后n行

-B n --before-context显示匹配字符前n行

-C n --context 显示匹配字符前后n行

-c --count 计算符合样式的行数

-i 忽略大小写

-v反转

-a处理二进制文件

-l 只列出文件内容符合指定的样式的文件名称

-f 从文件中读取关键词

-n 显示匹配内容的所在文件中行数

-R 递归查找文件夹

常用组合:grep -Rni “abc”

实例:

(1)查找指定进程

           ps -ef | grep svn    

(2)查找指定进程个数

           ps -ef | grep svn -c

(3)从文件夹中递归查找以grep开头的行,并只列出文件

            grep -lR '^grep' /tmp

(4)查找非x的行内容

            grep ‘[^x]' test.txt

(6)显示包含ed或者at字符的内容行

            grep -E 'ed|at' test.txt

##2.find

命令选项:

​   -name 按照文件名查找文件 “*123*” 通配符要加引号

    -iname忽略大小写

    -perm 按文件权限查找文件

​   -user 按文件属主查找文件

​   -group 按照文件所属的组来查找文件。

​   -type 查找某一类型的文件,诸如:

    ​   d - 目录  f - 普通文件

​   -size n :[c] 查找文件长度为n块文件,带有c时表文件字节大小  +代表大于 -代表小于

    -mmin n 查找系统中最后N分钟被改变文件数据的文件  n:正数代表外,负数代表内

​   -mtime n 查找系统中最后n*24小时被改变文件数据的文件  n:天数

 常组合用 最常用命令:find /home/test(路径) -type f -mtime +10 -exec rm -rf {} \;

举例:

​ (1)查找48小时内修改过的文件 find -mtime -2

​ (2)在当前目录查找 以.log结尾的文件。 ". "代表当前目录 find ./ -name '\*.log'

​ (3)查找/opt目录下 权限为 777的文件 find /opt -perm 777

​ (4)查找大于210M的文件 find ./ -size +210M

 find -size 1000c 查找等于1000字符的文件

​ (5)在当前目录中查找更改时间在10日以前的文件并删除它们(无提醒) find . -type f -mtime +10 -exec rm -rf {} \;

​ (6)当前目录更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除  文中查找所有文件名以.log结尾、件,         按n键不删除 find . -name '\*.log' -mtime +5 -ok rm {} \;

​ (7)用exec选项执行cp命令

 find . -name '\*.log' -exec cp {} test3 \;

​ (8)查找当前目录中以一个小写字母开头,最后是4到9加上.log结束的文件

​ find . -name '[a-z]\*[4-9].log' -print  find用的是:通配符\*

# 软件安装与更新

##1. rpm安装

rpm -ivh package.rpm    安装一个rpm包

rpm -Uvh package.rpm    更新一个rpm包但不改变其配置文件

rpm -qa | grep  显示系统中所有已经安装的rpm包

rpm -e package_name     删除一个rpm包

源代码编译安装

./configure

make

make install

##2. yum源安装

yum install package_name        下载并安装一个rpm包 常用

yum update package_name         更新一个rpm包

yum remove package_name         删除一个rpm包  

yum list                列出当前系统中安装的所有包

yum search package_name         在rpm仓库中搜寻软件包

yum clean all           删除所有缓存的包和头文件

# 网络配置

## 1.网络配置命令

ifconfig查看和配置网络接口

ip查看和配置网络接口、路由

netstat查看进程监听端口状态

network与networkmanager网络管理脚本

##2.配置文件

ifcfg-eth0 eth0 网卡配置文件

networking主机名配置文件

resolv.conf域名配置文件

#防火墙

##1. Selinux

常用命令

getenforce     状态的查看

Setenforce 0|1 #0表示警告模式1表示强制模式

配置文件

/etc/selinux/config

## 2.iptables

# Tcpdump

-i 指定网卡

-c指定抓包数量

-n不把网络地址转化成名字

-nn不进行duankou名称的转化

-w直接将分组写进文件中,而不是不分析并打印出来

-e在输出行打印出数据链路的头部信息

-vv输出详细的报文信息

host主机

port端口

#服务与日志

服务状态的查看命令

sevice    用法:sevice 服务名称 start/stop/restart/status

systemctl 用法:systemctl start/stop/restart/status 服务名称

常用服务日志

/var/log 系统日志默认目录

message系统日志

dmesg内核启动日志

secure安全日志

#磁盘分区

## 1.链接文件

符号链接

硬链接

##2. Mount挂载命令

-t文件系统类型

-o挂载选项  (ro只读挂载,rw读写挂载,remount重挂载)

配置文件

/etc/fstab

## 3.常用命令

Fdisk分区工具(-l查看分区信息、fdisk /dev/sdx为某一个存储分区)

df查看分区使用的空间大小 df -h

du查看文件夹使用空间大小 du -sh

mkfs格式化命令(mkfs.ext4 mkfs.xfs)

#系统启动过程与故障修复

##1.系统启动过程描述

Bios初始化,开始post开机自检,检查硬件

加载MBR到内存,加载磁盘主引导记录到内存

GRUB阶段

加载内核

systemd阶段

service服务或systemctl服务

启动,等待用户登录

#逻辑卷与lvm

Lvm分为三层:PV物理卷,VG卷组,LV逻辑卷

## 常用命令:

Pvcreate 建立pv        pvs查看pv

Vgcreate建立vg          vgs查看vg

Lvcreate建立lv            lvs查看lv

Lvextend扩展lv

# grep 搜索字符串匹配的行  搜索要匹配的字符串的行和文件

    强大的文本搜索命令,grep(Global Regular Expression Print)全局正则表达式搜索

    ​grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板,如果模板包括空格,则必须被引用。

    模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

   

### 命令格式:

    ​grep [option] pattern file|dir    grep -参数 [正则表达式] 文件或路径  “要搜索的字符串”

    ​常用参数:

    ​ -A n --after-context显示匹配字符后n行

    ​ -B n --before-context显示匹配字符前n行

    ​ -C n --context 显示匹配字符前后n行

    ​ -c --count 计算符合样式的行数

    ​ -i 忽略大小写

    ​ -l 只列出文件内容符合指定的样式的文件名称

    ​ -f 从文件中读取关键词

    ​ -n 显示匹配内容的所在文件中行数

    ​ -R 递归查找文件夹

    常用组合:grep -Rni “abc”

### grep的规则表达式:

    ​ ^ #锚定行的开始 如:'^grep'匹配所有以grep开头的行。

    ​ $ #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。

    ​ . #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。

    ​ * #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。

    ​ .* #一起用代表任意字符。相当于通配符的* 任意多个任意字符

    ​ [] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

    ​ [^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

    --- begin 使用场景较少 供参考 ---

    ​ \< #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。

    ​ \> #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。

    ​ x\{m\} #重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。

    ​ x\{m,\} #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。

    ​ x\{m,n\} #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。

    ​ \w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。

    ​ \W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。

    ​ \b #单词锁定符,如: '\bgrep\b'只匹配grep。

    --- end 使用场景较少 供参考 ---

   

### grep 实例:

​   (1)查找指定进程

​    ps -ef | grep svn  

    ​(2)查找指定进程个数

​    ps -ef | grep svn -c

    ​(3)从文件夹中递归查找以grep开头的行,并只列出文件

    ​ grep -lR '^grep' /tmp

​   (4)查找非x的行内容

    ​ grep ‘[^x]' test.txt

    ​(6)显示包含ed或者at字符的内容行

    ​ grep -E 'ed|at' test.txt


 

# sed     stream editor  用的正则表达式  对文件内容进行增删改查

    sed [选项] [命令] 文件名  

    sed的常用选项:

    -e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项

    -f:后跟保存了sed指令的文件

    -i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改

    -n: 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行

    sed中的编辑命令:

    a:追加  向匹配行后面插入内容    都会用到一个编辑命令

    c:更改  更改匹配行的内容

    i:插入  向匹配行前插入内容

    d:删除  删除匹配内容的行

    s:替换  替换掉匹配的内容

    p:打印  打印出匹配的内容,通常与-n选项合用

    =:用来打印被匹配的行的行号

    r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件    

### sed 举例

1 sed -i "/The start script/iabc" 1.txt         #增 在包含 The start script行之前进行添加行 abc

2 sed -i "/The start script/aabc" 1.txt         #增 在包含 The start script行之后进行添加行 abc

3 sed -i ‘s/指定的字符/要插入的字符&/’1.txt        #增 在指定的字符之前插入字符 默认只匹配第一个 如果要匹配所有的&/g

4 sed -i 's/指定的字符/&要插入的字符/’  1.txt  #增 在指定的字符之后插入字符

sed -i 's/cp \$HIVE_HOME/\\&/' /opt/cloudera/parcels/CDH/lib/hive/bin/hive-config.sh  

5 sed -i ‘s/^.\*23/#&/g’ 1.txt                  #增 注释掉某一行

6 sed -i '/ac/d' 1.txt                          #删 删除包含ac的行

7 sed  '4d'  1.txt                              #删 删除第四行

8 sed -i "s/ac/bd/g" 1.txt                      #改 老字符替换成新字符

9 sed -i '/ac/c hello ' start_es.sh  sed "/11/c999" 1.txt       #改 替换包含ac的一行的内容

10 sed '3ahello' 1.txt    #向第三行后面添加hello,3表示行号

11 sed '3ihello'  1.txt   #在第三行之前插入hello

12 sed  -n '3p'  1.txt    #打印文件中的第三行内容

13 sed -n '1,3p'  1.txt   #打印1到3行

14 sed  '/^$/d'    1.txt  #删除空行

15 sed -i '/bbb/r 2.txt' 1.txt # 读取2.txt文件,将文件内容写入到1.txt中匹配bbb的行之后。

16 sed -i 'r 2.txt' 1.txt # 读取2.txt文件,将文件内容写入到1.txt每一行之后。

17 sed ‘/789/w a.txt’ 1.txt #如果1.txt包含789的行,将包含789的行覆盖写入到a.txt中,如果不包含,清空a.txt

18 sed ‘w a.txt' 1.txt #将文件1.txt的内容写入到a.txt

19 sed -i -e '1,3d' -e '/abc/cABC' 1.txt #-e的用法举例,先删除1到3行,然后将匹配abc的行替换为ABC。

20 sed -n -e '/a/p' -e '/a/=' 1.txt  #先打印文件匹配行的内容,再打印文件匹配航的行号。

21 sed -n  ‘/abc/=' 1.txt   #打印匹配行的行号

# sort  排序 sort

    默认按ASCII码值进行比较,最后将他们按升序输出

   

    示例1

    sort 1.txt  #   排序

   

    示例2

    sort -u 1.txt   #   排序并去重 常用

    示例3

    sort -r 1.txt   #   降序进行排序

   

    示例4 慎重

    [rocrocket@rocrocket ~]$ sort -r number.txt > number.txt

    [rocrocket@rocrocket ~]$ cat number.txt

    [rocrocket@rocrocket ~]$

    // 看,竟然将number清空了

    这个时候 -o就出现了,

    sort -r 1.txt -o 1.txt  #   -o(output) 输出到原文件

   

    示例5

    10比2小的情况。

    要使用-n选项,来告诉sort,“要以数值来排序”! 常用

    sort -n(number) number.txt

    示例六

    这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,    第三列表示水果价格。那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实 现?幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut的-d选项)

    指定了间隔符之后,就可以用-k来指定列数了。

    sort -n -k 2 -t : facebook.txt  

    # -t 分隔符为:,-k 以第二列进行排序,-n 按照数值进行排序

   

    示例七

    -f  会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

    -b  会忽略每一行前面的所有空白部分,从第一个可见字符开始比较

   

    示例八

    我想让facebook.txt按照公司人数排序 ,人数相同的按照员工平均工资升序排序

    sort -n -t ' ' -k 2 -k 3 facebook.txt

    看,我们加了一个-k2 -k3就解决了问题。sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序。

    (如果你愿意,可以一直这么写下去,设定很多个排序优先级)


 

# uniq  去重

    用法:uniq [选项]... [文件]

    从输入文件或者标准输入中筛选相邻的匹配行并写入到输出文件或标准输出。

    参数:

    -c, --count                       在每行记录前显示该行内容的数量

    -d, --repeated                    仅显示重复的记录行,并且去重  

    -D, --all-repeated[=delimit-method]     仅显示重复的行,并不去重

    -i, --ignore-case                 忽略大小写 以最先的字符为准

    -s, --skip-chars=N                比较时跳过前N个字符

    -u, --unique                      仅显示非重复的行  

    -w, --check-chars=N               只对比指定的N个字符,默认是从开始算起,如果和-s一起使用那么要排除-s指定的字符数

### 举例

    uniq -c 1.txt               #   1.显示行的数量

    uniq -d 1.txt               #   2.只显示重复的行,并去重

    uniq -u 1.txt               #   3.仅显示非重复的行

    uniq -s 2 -w 2 1.txt        #   4.-s和-w

    -s 2:忽略前两个字符,即从第三列开始比较

    -w 2:只比较两个字符,即只比较第三列开始的两个字符

### 《 sort+uniq 》

•   uniq     去除重复的行,最终结果包含重复和非重复的行。

•   uniq -u 只打印非重复的行。

•   uniq -d 只打印重复的行。

   

#### 两个文件的交集 --- 重复的行   先排序再去重  p排序之前先去重

sort out1.txt out2.txt | uniq -d    

\# -d 输出重复的行, 需要注意一个问题,那就是这两个文件,在各自的文件中不要出现重复的数据(要先对各个文件进行排序去重)

两个文件的并集 --- 去重之后的行,包括重复的已被去重的行和不重复的行

sort out1.txt out2.txt | uniq           # uniq不加参数意思是去掉重复的数据

#### 两个文件的差集

out1.txt-out2.txt

sort out1.txt out2.txt out2.txt | uniq -u

讲解:sort out1.txt out2.txt out2.txt 会让out2.txt的所有内容都出现两次,所以uniq -u 之后不会出现 out2.txt 里面的内容;而out1.txt和out2.txt重复的内容会至少出现3次以上,也不会输出到结果中.

所以最终结果一定是out1.txt在out2.txt中没有出现过的数据,也就是out1.txt-out2.txt的差集


 

### 《 sort+uniq 》

out2.txt - out1.txt

sort out1.txt out1.txt out2.txt | uniq -u

原理请看上面的out1.txt-out2.txt的讲解,原理是一样的

   

#### [提醒]

去除文件重复的行

在shell中可以利用uniq

sort unsorted.txt | uniq  

注意:要先进行排序,才能调用uniq (uniq命令,只是把相邻的重复的数据行去掉)


 

#### paste 粘贴

paste [ -d -s ] -file1 file2

选项含义如下:

    -d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用-d @。

        -s 将每个文件合并成行


 

# awk   具有强大的文本格式化能力    一个强大的文本分析工具

    awk [options] 'pattern{action}' file 

    command | awk ' condition { action }'

   

    示例1 全部打印

    awk '{print}' 1.txt

   

    示例2 添加前缀和后缀

    awk 'BEGIN{print "col1","col2"} {print} END{print "end1","end2"}' a.txt

   

    示例3 -F 指定分隔符  常用

    awk -F "+" '{print $2}' a.txt  必须单引号

   

    示例4

    NF(当前行的字段个数)    $NF就代表最后一个字段,$(NF-1)代表倒数第二个字段

    echo "aa bb cc  dd" | awk '{print $NF}'

    echo "aa bb cc  dd" | awk '{print $(NF-1)}'

   

    示例5     不打印某一列时,将对应列设置为空字符串即可,用 $NF="",设置多列时用分号分隔开

    cat aa.txt | awk '{$NF="";print $0}’            #不打印最后一列

    cat aa.txt | awk '{$(NF-1)="";$NF="";print $0}'     #不打印最后两列

    示例6 NR (当前处理的是第几行)    row 行 Colum 列

    cat test.txt | awk '{print NR")", $0}'  #打印当前行号和当前文本内容  $0 打印所有

    逗号表示输出的变量之间用空格分隔

    右括号必需使用 双引号 才可以原样输出

   

    示例7 打印指定行内容

    java -version 2>&1  | awk 'NR==1 {print $0}'    #打印第一行

    cat a.txt | awk ‘NR==3  {print $0}'

   

    示例8 awk 允许指定输出条件,只输出符合条件的行

    awk  '条件 {动作}' 文件名

   

    特殊字符需要转义

    cat exp.txt | awk '/stsvc\/fms/ {print $0}' #包含 stsvc/fms 的行

    cat exp.txt | awk 'NR>4 {print $0}'         #大于第四行

    cat test.txt | awk '$2=="ff" {print $0}'    #某个字段等于具体值

    echo "aa ss dd" | awk '{ if($3 == "dd") print $0; else print "nothing"}'    # if条件

## 1.使用终端:

命令提示符:$普通用户  #root用户

命令和路径补全:tab键

命令的分类(使用type查看某个命令的所属分类):内部命令和外部命令


 

## 2.帮助命令和用法:有问题找man

man:man xxx 获取xxx命令的帮助

man 1 man:查看man命令自身的帮助文档

help xxx:获取内部命令的帮助

xxx—help:获取外部命令的帮助

info:比man更丰富的帮助信息,格式:info xxx

# 文件与目录管理

## 1.ls文件与目录查看命令

-l 显示文件的详细信息

-a显示隐藏文件

-r逆序显示

-t按时间排序

-R递归显示

## 2.路径操作(分绝对路径和相对路径)路径操作(分绝对路径和相对路径)

cd进入指定路径

pwd显示当前路径

## 3.建立与删除目录

mkdir新建目录

rmkdir删除空目录

## 4.通配符

*匹配任意字符

?匹配单个字符

[xyz]匹配xyz任意一个字符

[!xyz]或[^xyz]匹配不在xyz中的任意字符

##5.复制文件cp

-r复制目录

-p保留用户权限时间

-a尽可能保留原始文件的属性,等同于-dpR

##6.删除文件rm

-r递归删除

-f不提示

## 7.移动与重命名

移动文件 mv file1 dir1/

重命名文件 mv file1 file2

##8.文本查看

head显示文本前n行

tail显示结尾n行

cat file 查看文件

cat –f显示文件更新消息

##9.打包和压缩

a.tar 打包命令

    tar -czvf test.tar.gz a.c  //压缩a.c文件为test.tar.gz

    tar –xzvf test.tar.gz //解压文件

   

b.gzip 123.txt  gunzip  123.txt.gz   gzip -d 123.txt.gz

    -r 压缩目录

    -c 保留原文件 进行压缩 gzip -c 123.txt > 123.txt.gz

    -数字 用于指定压缩等级,-1 压缩等级最低,压缩比最差;-9 压缩比最高。

        默认压缩比是 -6

       

c.zip file1.zip file1 创建一个zip格式的压缩包

    zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包

    unzip file1.zip 解压一个zip格式压缩包 (这个也要记)

   

d.rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包,需要单独安装

    rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1'

    rar x file1.rar 解压rar包

    unrar x file1.rar 解压rar包

# Vim文本编辑器

##1.正常模式

iIoOaA进入插入模式

i在当前光标位置进入插入模式

I移动到当前光标所在行首,进入到插入模式

a在当前光标位置之后进入插入模式

A移动到当前光标所在行尾,进入到插入模式

o在当前光标下一行进入插入模式

O在当前光标上一行进入插入模式

V(字符可视化) V(行可视化) ctrl+v(块可视化) 进入可视模式        

:进入命令模式

Esc 回到正常模式

hjkl上下左右

yy y$复制

Ctrl+r重做命令

dd d$剪切

p粘贴

u撤销

X删除单个字符

r替换单个字符

G定位指定的行

^$定位到行的开头和结尾

##2.命令模式

w写入文件

w文件名 另存文件

q推出

q!不保存退出

wq!保存退出

!cmd执行命令

/查找命令

s/old/new替换命令

set nu设置行号

# 用户管理

groupadd group_name 创建一个新用户组   vi /etc/group

groupdel group_name     删除一个用户组

groupmod -n new_group_name old_group_name   重命名一个用户组

useradd -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户

useradd user1   创建一个新用户       vi /etc/passwd

userdel -r user1    删除一个用户 ( '-r' 排除主目录)

usermod -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性

passwd  修改口令   passwd user1 修改一个用户的口令 (只允许root执行)

/etc/passwd用户信息配置文件

/etc/shadow用户密码信息配置文件

su – hive   切换用户,带上- 也切换了环境变量

sudo -i 切换到超级用户 vi /etc/sudoers 添加 hadoop ALL=(ALL) NOPASSWD:NOPASSWD:ALL

who/w   查看登录的用户信息

# 权限管理

chmod   改变文件或目录权限

     -R 递归修改    u/g/o/a +-= r/w/x   777

chown   -R  改变文件或目录所有者  用户:用户组

chgrp   -R  改变文件或目录所有组

备注:-c 回显修改前后信息

• Shell 是命令解释器,用于解释用户对操作系统的操作

• Shell 有很多

    B shell;C shell;k shell;z shell

    • cat /etc/shells

• CentOS 7 默认使用的 Shell 是 bash


 

# Shell脚本

●  基本组成元素:命令

●  一条命令只做一件事情

    demo:cd /var ; ls ; pwd ; du –sh * ; du –sh

●  bash脚本文件.sh

●  脚本文件需要执行权限 x  chmod u+x .sh

●  bash a.sh

●  #!/bin/bash


 

Shell脚本组成

●  #!/bin/bash

●  一系列命令

●  注释 #

●  chmod u+x a.sh

●  执行脚本命令

    ●  bash ./a.sh  不需要执行权限

    ●  ./a.sh

    ●  source ./a.sh

    ●  . a.sh


 

### 内建命令和外部命令的区别内建命令和外部命令的区别

• 内建命令不需要创建子进程

• 内建命令对当前 Shell 生效

• type



 

### 管道和重定向


 

####1. 管道和管道符

• 管道和信号一样,也是进程通信的方式之一

• 匿名管道(管道符)是 Shell 编程经常用到的通信工具

• 管道符是“|”,将前一个命令执行的结果传递给后面的命令

• ls –l | more

• cat  |  ps -ef

• 分号和管道符        连接命令


 

####2. 子进程与子 Shell

• 子进程是 Shell 程序,称作子 Shell


 

####3. 重定向

• 一个进程默认会打开标准输入、标准输出(正确输出)、错误输出三个文件描述符0,1,2

                   

• 输入重定向符号 “<” 读文件 从文件读数据

    read var < /path/file

    echo $var

• 输出重定向符号 “>” “>>” “2>” “&>” ”2>>” “&>>”  默认1>(正确输出)

    2> 错误重定向    &> 正确和错误的都进行重定向

    echo 123 > /path/file

    demo: wc –l   等待输入的行数 ctrl+d结束   word count

                wc –l < file

• << 分界符 读入数据,直到遇到分界符停止  自动化生成脚本

     cat > /path/file << EOF

             …

     EOF



 

### 变量   没有类型



 

####1. 变量的定义

• 变量名的命名规则

    • 字母、数字、下划线

    • 不以数字开头

    • 有意义的单词


 

####2. 变量的赋值

• 为变量赋值的过程,称为变量替换

    • 变量名=变量值

        • a=123

    • 使用 let  进行运算

        • let a=10+20

    • 将命令赋给变量

        • l=ls

    • 将命令的结果赋给变量,$()或者``

        • a=$(ls /etc)

        • a=`ls /etc`  反引号 `` 1傍边的那个键

    • 变量值有空格等特殊字符要包含在””或’’中

        • string1=hello abc --- 错误


 

####3. 变量的引用

• ${变量名} 称作对变量的引用

• echo ${变量名} 查看变量的值  {}让系统知道是变量

   

• ${变量名} 与 $变量名    使用${}这种方式的好处是可以方便的实现两个变量的连接 比如路径


 

####4. 变量的作用范围

• 变量的默认作用范围

   

    • 当前shell生效;子shell、平行shell或者shell的父进程都不生效

   

    • demo:a=1

           bash

    • demo: var1=“hello abc”

                          四种执行脚本方式查看var1

• 变量的导出

    • export --- 子shell可以使用父shell的变量  相当于将变量变成全局变量

• 变量的删除

   

    • unset 变量


 

####5. 系统环境变量

• 环境变量:每个 Shell 打开都可以获得到的变量

    • set 和 env 命令

    • $PATH

       命令搜索路径 重要

    • $?     脚本命令的返回值   真:0    非0:假

    • $$  进程id  $0 进程名

        demo: 运行脚本

    • $PS1

• 位置变量

   

    • $1    $2…$n  赋值

       demo: pos2=${2-_}   赋初值


 

####6. 环境变量配置文件

• 配置文件

   

    • /etc/profile  1  最常用    四大配置文件  :1234      .文件名:隐藏文件

    • /etc/bashrc      2

    • /etc/profile.d/  

    • ~/.bashrc        3

    • ~/.bash_profile  4


 

一:

• 对于/etc下的配置文件,所有用户都通用

• 对于家目录下的配置文件,是区分用户的,用户所特有的配置

二:

• login shell:命令就是,su – 用户名      nologin不能登录

              所有的配置文件都会被执行

• nologin shell:命令就是,su 用户名

              ~/.bashrc和/etc/bashrc被执行,配置文件加载不完全


 

Demo:配置文件的加载


 

• 添加的环境变量,不会立即生效

• 如何立即生效

    source /etc/bashrc   改完就执行source  重要



 

### 数组

• 定义数组

  • hosts=( storage-1 storage-2 storage-3 )

• 显示所有元素

  • echo ${hosts[@]}

• 显示数组元素个数

  • echo ${#hosts[@]}

• 显示数组的第一个元素

  • echo ${hosts[0]}


 

### 转义与引用



 

####1. 转义与引用 – 特殊字符

• 特殊字符:

    • # 注释

    • ; 分号

    • \ 转义符号

    • “和’ 引号  ‘’里面是啥就是啥  “”取变量的值     \”相当于单引号


 

####2. 转义与引用 – 转义符号

• 单个字符前的转义符号   echo -e “\n”

    • \n 换行\r 回车(回到行首)\t 制表符 单个字母的转义

    • \$ \” \\ 单个非字母的转义   --- 转义成普通符号

   

    • demo: $a  abc”x”def


 

####3. 转义与引用 – 引用

• 常用的引用符号

• “ 双引号

• ‘ 单引号

• ` 反引号

Demo: “$var1”   ‘$var1’


 

### 运算符  shell计算性能差


 

####1. 赋值运算符

• = 赋值运算符,用于算数赋值和字符串赋值

• 使用 unset 取消为变量的赋值

• = 除了作为赋值运算符还可以作为测试操作符  相当于c语言的==


 

####2. 算数运算符  expr本身就是命令

• 使用 expr 进行运算

     • expr 3 + 4  注意空格

                expr不支持浮点数


 

• 基本运算符

   

    • + - * /  %   \*转义 对于乘号需要转义

####3. 数字常量

• 数字常量的使用方法

    • let “变量名 = 变量值”

    • 变量值使用 0 开头为八进制

    • 变量值使用 0x 开头为十六进制

   

    bc

####4. 双圆括号

• 双圆括号是 let 命令的简化

• (( a = 10 ))

• (( a++ ))

• echo $((10+20))

Demo: expr

    (( a=4+5 ))

    (( a++ ))

    (( a-- ))


 

### 测试与判断


 

####1. 退出与退出状态

• 退出程序命令

    • exit  --- shell脚本的退出命令,返回其上方命令的运行结果编码

   

    • exit 10  返回10给 Shell,返回值非 0 位不正常退出  

    • $? 判断当前 Shell 下前一个进程是否正常退出

Demo: 脚本 exit


 

####2. 测试命令 test

• test 命令用于检查文件或者比较值

• test 可以做以下测试:

    • 文件测试

    • 整数比较测试

    • 字符串测试

• test测试语句可以简化为 [ ] 符号  与if

• [ ] 符号还有扩展写法 [[ ]] 支持 && || < > !



 

• demo:man test

###### a. 字符串测试:

    • STRING1 = STRING2   比较字符串

    • STRING1 != STRING2  

    • -z STRING    zero  是否为空  -n 是否为非空


 

• demo:man test

###### b.整数比较测试:

    • INTEGER1 -eq INTEGER2  equal 等于

    • INTEGER1 -ge INTEGER2   greater equal 大于等于

    • INTEGER1 -gt INTEGER2  大于

   

    • INTEGER1 -le INTEGER2  小于等于

    • INTEGER1 -lt INTEGER2   小于

    • INTEGER1 -ne INTEGER2  noequal 不等于

注意 [] 单方括号进行比较的时候,不能使用 < >



 

• demo:man test

###### c. 文件测试:

    • -e FILE  判断文件是否存在  exist

    • -d FILE 目录   判断是否是目录并且存在

    • -f FILE   判断是否是文件并且存在




 

####3. 使用 if-then语句

• test 测试语句可以简化为 [ ] 符号

• if-then 语句的基本用法   不要吝啬空格  中括号中两端的空格一定要加上,十分重要

   

    if [ 测试条件成立 ] 或命令返回值为0    if [  ]; then     if [ ]; then  if [ ]; then  

                                                                 命令

                                                             fi

                                             命令

    then 执行相应命令

    四个空格+命令

    fi 结束

Demo:1 判断用户 [ $UID = 0 ]   [ $USER = “root” ]  注意空格

     2 if 后跟命令 pwd 以及 abc


 

####4. 使用 if-then-else 语句

• if-then-else 语句可以在条件不成立时也运行相应的命令

    if [ 测试条件成立 ]

   

    then 执行相应命令

   

    else 测试条件不成立,执行相应命令

   

    fi 结束

Demo:

    if [ $USER = root ]; then

           echo “root user”

    else

           echo “other user”

    fi  


 

####5. 使用 if-elif-else 语句

• if-then-else 语句可以在条件不成立时也运行相应的命令

    if [ 测试条件成立 ]

   

    then 执行相应命令

    elif [ 测试条件成立 ]

   

    then 执行相应命令

   

    else 测试条件不成立,执行相应命令

   

    fi 结束

Demo:   root user1 other


 

####6. If的嵌套

• if 条件测试中可以再嵌套 if 条件测试

    if [ 测试条件成立 ]

   

    then 执行相应命令

       

        if [ 测试条件成立 ]

       

        then 执行相应命令

       

        fi

    fi 结束

Demo:root用户+脚本存在,执行



 

### case 分支

• case语句

case “$变量” in        

                case "$pos" in    case  esac

模式1)

  四个空格  cmd…

    ;;

模式2)

    cmd…

    ;;

* )

    cmd…

    ;;

esac

case 分支

Demo:.sh start/stop/restart/reload


 

### 循环



 

####1. 使用 for 循环遍历命令的执行结果

• for 循环的语法

    for 参数 in 列表

    do

        执行的命令

    done 结束

• 使用反引号或 $() 方式执行命令,命令的结果当作列表进行处理


 

####2. 使用 for 循环遍历变量和文本

• 列表中包含多个变量,变量用空格分隔

• 对文本处理,要使用文本查看命令取出文本内容

    • 默认逐行处理,如果文本出现空格会当做多行处理


 

Demo:

    # 回显

    for i in {1..9}

   

    # 修改文件名字

    for file in `ls *.cpp`

        扩展:basename a.cpp .cpp  取文件名  basename $file .cpp

   

####3. C 语言风格的 for 命令

for ((变量初始化;循环判断条件;变量变化))

do    

   

    循环执行的命令

done

Demo:

    # 回显数值

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


 

####4. while 循环

while test测试是否成立

do    

        命令

done

####5. 死循环

while test测试⼀一直成立

do    

    命令

done

####6. until 循环

• until 循环与 while 循环相反,循环测试为假时,执行循环,为真时循环停止  直到成立就退出


 

Demo:

    # while [ $a -lt 10 ] ; do done   while空格:(死循环)空格

    ((a++))

    # 死循环

    while :

        sleep 2

    # util 条件为假 执行

       util [ 5 –lt 4 ];

       do

        echo always

       done

   



 

### 循环的使用

• 循环和循环可以嵌套

• 循环中可以嵌套判断,反过来也可以实现嵌套

• 循环可以使用 break 和 continue 语句在循环中退出


 

Demo:

    # 循环嵌套if的demo    /etc/profile.d/*.sh

    # 九九乘法表    echo -n 后面紧跟着的echo不换行  echo -e 转义符号



 

####1. break  循环直接结束

####2. continue 结束本次循环,进入到下一次循环


 

Deno:# 打印数字,break和continue 结束循环和结束本次循环



 

####3. 使用循环处理命令行参数

• 命令行参数可以使用 $1 $2 … ${10}… $n 进行读取

• $0 代表脚本名称

• $*(常用) 和 $@ 代表所有位置参数

• $# 代表位置参数的数量

Demo:根据入参名称不同,执行不同的结果

     for pos in $*

     do

        do something

     done

或者

    while [ $# -ge 1 ]

    do

        do something

        shift   左移

    done


 

### 函数

• 自定义函数

• 系统脚本


 

####1. 自定义函数

• 函数用于“包含”重复使用的命令集合

• 自定义函数

    function fname() {

    命令

    }

• 函数的执行

    • fname

Demo:   #编写脚本 实现 cd 和 du –sh 的函数


 

####2. 自定义函数   默认都是全局变量

• 函数作用范围的变量

    • local 变量名  变成局部变量

• 函数的参数

   

    • $1 $2 $3 … $n

Demo:1 输入目录名参数,实现 du –sh  disk usage

       

     2 checkpid是否存活,一个pid和多个pid输入  grep -w pid  完全匹配 grep -v grep  排除grep命令 grep -v $0

       

      $0 进程名

####3. 系统脚本

• 系统自建了函数库,可以在脚本中引用

    • /etc/init.d/functions

• 自建函数库

    • 使用 source  函数脚本文件“导入”函数

Demo:   echo_success

        source /etc/init.d/functions 先调用函数库才能使用系统函数



 

### 脚本控制

• 脚本所占资源的控制

• 避免出现“不可控的”死循环

    • 死循环导致cpu占用过高

    • 死循环导致死机

Demo:经典的fork炸弹

    function func() { func | func & }

    可简写为

    .() { .|.& };.




 

### 捕获信号

• 捕获信号脚本的编写

    • kill默认会发送15号信号给应用程序

    • ctrl+c发送2号信号给应用程序

    • kill -9 9号信号不可堵塞

Demo:trap “echo signal 15” 15  

     脚本

     使用while :死循环查看捕获信号效果


 

### 计划任务

• 一次性计划任务 at  系统自动执行   必须用绝对路径

Demo:   # at 时间  +    写脚本的绝对路径

   

     ctrl+d提交

   

     atq 查询

     

         atrm 任务号  删除

     at -c 任务号  #查看任务具体内容

        systemctl start atd

### 一次性计划任务

at 时间格式

at 指定时间的方法很丰富:

hh:mm 小时:分钟(当天,如果时间已过,则在第二天执行);

midnight(深夜),noon(中午),teatime(下午茶时间,下午4点),today,tomorrow等;

12小时计时制,时间后加am(上午)或pm(下午);

指定具体执行日期:mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年);

相对计时法:now + n units,now是现在时刻,n为数字,units是单位(minutes、hours、days、weeks)


 








 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值