什么是shell脚本?

shell:是完成一些稍微复杂的需求(靠linux命令解决不了)与完成一些重复性操作

shell脚本从上往下依次运行,如果中间出现错误,会接着运行服务器巡检,写shell脚本,zabbix(一个对服务期各项数据进行统计的图形界面软件)

重定向(覆盖|删除)

>正确重定向覆盖

>>正确重定向追加

2>错误重定向覆盖

2>>错误重定向追加

&>混合重定向覆盖

&>>混合重定向追加

                bash dgf.sh > /root/dgf.log  2>&1bash dgf.sh &> /root/dgf.log  #####这两个追加是同一个性质

变量名=变量值

name =dgf如果想查看name的值:echo "$name"

引号:

双引号:弱引用,会将变量所对应的值打印

单引号:强引用,单引号中的内容是什么,就打印什么

三引号:批量写入内容,例如:cat << EDH > haha

hahahahahah

EDH

$符号的引用:

$@ 位置变量的内容是单个的
$* 显示变量内容。整体的,不换行的
$$ 显示此文件的进程号
$# 有显示此文件后面的变量数量
$?  上一条命令的返回结果
$0 脚本本身的名称

脚本1:将*号按照循序排列开来,效果:*

**

***

****

*****

!#/bin/bash
for i  in {1..5}            #循环五次
do     for  x    in {1..5}     #变量名x循环五次doif [ $i -le $x ]; then echo -n "x"; fi      #如果$i 小于等于  $x 就输出*号,-n 就是不换行输出done echo " "               #输出空行,相当于回车换行
done

脚本2:将文字按照9 9乘法表的方式排开

#!/bin/bash
for x in {1..9}dofor y in {1..9}doif [ $y -le $x ]; then echo -n "  $y X $x = $(expr $y \* $x)"; fidone echo " "
done

脚本3:测试主机是否存活

#!/bin/bash
for i in 192.168.100.{1..254};do  ping -c1 -w 1ms $i &> /dev/nullif[ $? -eq 0 ];then echo "$i存活"fi
done

脚本4:for的两次无限循环、

#!/bin/bash
for ((i=0;i<3;i++))
doi=1echo "无限循环中"
done

碰到了一个面试题:

#!/bin/bash
#问:有若干只兔和鸡,兔和鸡加起来一共有100条腿,请写一个简单的shell,算出兔和鸡各多少只可能组合(假设所有的兔和鸡的腿都是健全的,且兔和鸡至少
为1只)
for tu in {1..25}
dofor ji in {1..50}doif [ $(expr $(expr 4 \* $tu ) + $(expr 2 \* $ji )) -eq 100 ];then echo "兔:$tu ;鸡:$ji";fidone
done

正则表达式:

什么是正则表达式?

            正则表达式是检查字符串中是否含有特定字符,一般是以行为单位检查, 就相当于如果这一行中有指定的字符,就将这一行都输出出来,正则表达式中也有很多的特殊符号用来进行快捷选择,主要是用来分析|处理|修改配置文件及查看一些配置

正则表达式的种类?

一个是基本正则表达式

正则符

正则符解释
^ 代表开头,以谁开头
$

代表结尾,以谁结尾

^$ 代表空格,空行
. 任意一个单字符
* 重复前面的字符0次到多次
*. 所有字符串(任意长度,任意字符)
\ 转义符,例如:\.  将点转为普通字符 

\{n\}

匹配前面的字符出现n次  例:grep "do \{3\}g" hehe.txt
\{n,\} 匹配前面的字符最少几次
\{,n\} 匹配前面字符最多几次
\{n,m\} 匹配前面字符最少几次,最多几次
[  ] 匹配包含其中的任意一个字符
[ ^] 不匹配包含其中的任意一个字符

一个是扩展正正则表达式

扩展正则符

扩展正则解释
grep -E||egrep 必须使用-E ,或者egrep不然就会报错
+ 前边的字符最少出现1次
前边的字符最多出现1次 例:grep -E "go?d" 123.txt
() 匹配包含括号中的内容

正则表达式三剑客(grep,sed,awk)

                grep命令:对文件中的内容逐行过滤,查到有特殊字符的行

1.查看文件时显示行号

[root@localhost ~]# grep -n "goood" 123.txt
输出:13:goood
[root@localhost ~]# cat -n 123.txt 1   11 1232 22 12343    11 4314 23 431215   444 43126   444 43217   22 54321 8  111 21439   1q10    ·:“··1 213411    god12   good13  goood14 gooood15    goooood16   gooooood17  goooooood

2.查看指定字符在文件中出现几次

[root@localhost ~]# grep -c "11" 123.txt
3

3.不要查看root在文件/etc/passwd

[root@localhost ~]# grep -v "root" /etc/passwd
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

4.输出指定字符的上一行与下一行

[root@localhost ~]# grep -A1 "good" 123.txt     #显示上一行
good
goood
[root@localhost ~]# grep -B1 "good" 123.txt     #显示下一行
god
good
[root@localhost ~]# grep -C1 "good" 123.txt     #显示指定字符的上下两行
god
good
goood

7.在/etc/查找所有带root的文件

[root@bogon ~]# grep -rl "root" /etc/
/etc/fstab
/etc/grub.d/00_header
/etc/grub.d/01_users
/etc/grub.d/10_linux
/etc/grub.d/20_linux_xen
/etc/grub.d/30_os-prober
/etc/pki/ca-trust/ca-legacy.conf
/etc/pki/ca-trust/extracted/README
/etc/pki/ca-trust/extracted/java/README
/etc/pki/ca-trust/extracted/java/cacerts
/etc/pki/ca-trust/extracted/openssl/README
/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
/etc/pki/ca-trust/extracted/pem/README
/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
[root@bogon ~]# grep -rl "root" /etc/ |wc -l     #wc -l输出的行数  -w报告单词数 -c报告字节数98

6.总结:

  grep 

-n 查看文件时可以显示行号
-v 查看文件时,不要查看指定字符
-c 统计特殊字符在文件中出现的次数
-A 查看指定字符和它的上一行
-B 查看指定字符和它的下一行
-C 查看指定字符和它的上下两行

sed命令:是用来非交互的方式,增删改查文件

1.查看文件1~3行:

[root@localhost ~]# sed -n "1,3"p 123.txt
11 123
22 1234
11 431

2.查看文件中的1行和3行:

[root@localhost ~]# sed -n "1p;3p" 123.txt
11 123
11 431
[root@localhost ~]# sed -n -e1p -e3p 123.txt #查看1行和3行 -e执行多个任务
11 123
11 431

3.查看所有文件中god的行

[root@localhost ~]# sed -n '/god/p' 123.txt
god

4.替换文件中的字符

[root@localhost ~]# sed -i 's/o/a/g' 123.txt
[root@localhost ~]# cat 123.txt
gad
gaad
gaaad
gaaaad
gaaaaad
gaaaaaad
gaaaaaaad

5.在第三行添加#号

[root@localhost ~]# sed -i '3s/^/#/g' 123.txt
[root@localhost ~]# cat 123.txt
11 123
22 1234
#11 431
23 43121
444 4312
444 4321
22 54321
111 2143
1q
·:“··1 2134
gad
gaad
gaaad
gaaaad
gaaaaad
gaaaaaad
gaaaaaaad

6.将文件第三行强行差入一个hello,world

[root@localhost ~]# sed -i '3i hello,world' 123.txt
[root@localhost ~]# cat 123.txt
11 123
22 1234
hello,world
#11 431
23 43121
444 4312
444 4321
22 54321
111 2143
1q
·:“··1 2134
gad
gaad
gaaad
gaaaad
gaaaaad
gaaaaaad
gaaaaaaad

7.将hello,world,插入第七行下方

[root@localhost ~]# sed -i '7a hello,world' 123.txt
[root@localhost ~]# cat 123.txt
11 123
22 1234
hello,world
#11 431
23 43121
444 4312
444 4321
hello,world
22 54321
111 2143
1q
·:“··1 2134
gad
gaad
gaaad
gaaaad
gaaaaad
gaaaaaad
gaaaaaaad

awk命令:AWK是专门为文本处理涉及的编程语言,与sed类似都是以数据驱动的,处理软件,主要用于数据扫描过滤,统计汇总工作,数据来自标准输入管道或者文件。

一.基础的语法格式:

awk [选项] '条件{动作};条件{动作}'...文件名

二.常用的awk内置变量

FILENAME 当前输入的文档名称
FNR 当前输入文档的当前行号,尤其当有多个输入文档时尤其有效
NR 输出行号
$0 当前行的全部内容
$n 当前行的第n个字段内容(n>=1)
NF 记录当前行的分割列数
FS 字段分隔符,相当于-F
OFS 输出字段分隔符,默认为空格
ORS

输出记录分隔符,默认为回车\n

RS 输入记录分隔符,默认为换行符
[root@MiWiFi-R4CM-srv ~]# awk '{print FILENAME}' 123.txt
123.txt
#文本里有几行,就输出几遍名字
[root@MiWiFi-R4CM-srv ~]# awk '{print NF}' 123.txt
2
1
4
#统计每行有几段
[root@MiWiFi-R4CM-srv ~]# awk -v FS=":" '{print $1}' /etc/passwd
#FS就相当于awk里面的-F
[root@MiWiFi-R4CM-srv ~]# head -1 /etc/passwd | awk -F: -v OFS="------" '{print $1,$6}'
root------/root
#正常输出应该是:root /root   ,OFS可以将空格变为------
[root@MiWiFi-R4CM-srv ~]# head -2 /etc/passwd | awk -F: -v ORS="------" '{print $1,$6}'
root /root------bin /bin------[root@MiWiFi-R4CM-srv ~]#
#FRS是将行与行之间换成了------

三.自定义变量(自定义变量要加-v):

awk -v name="dgf" -v age=28 '{print name,age}' 文件名
[root@MiWiFi-R4CM-srv ~]# awk -v name="dgf" -v age=28 'END{print name,age}' hehe
dgf 28

(1)在文件中自定义变量:

#!/bin/bash
name=qwe
123=456
awk '{print "'$name'","'$123'"}'

(2)自定义分隔符:awk -F "[;_ ]" '{print $1}' /etc/passwd   #只要有这三个符号都当成分隔符

(3)print指令:输出常量和变量,如果是字符串常量所需要用双引号括起来数字不需要。

awk '{print 123}' 文件名
awk '{print "IP:" ,$1}' 文件名

(4)条件匹配:

awk支持使用正则进行模糊匹配,也支持字符串和数字的精确匹配,并且支持逻辑与和逻辑或。

//:匹配包含//中的行  例:

[root@MiWiFi-R4CM-srv ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

!//:不匹配包含//中的行 例:

[root@MiWiFi-R4CM-srv ~]# awk '!/root/' /etc/passwd
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

(5)BEGIN和END

BEGIN导致定做只喊仅在读取任何数据记录,之前执行一次(数据初始化)

END    导致定做指令尽在读取完所有数据记录后执行一次(数据汇总)

(1)awk 'BEGIN{print "ok"}'
(2)awk 'END{print NR}' /etc/passwd #打印最后一行的行号
(3)awk 'BEGIN{print "ko"};{print $1};END{print "**"}' /etc/passwd | column -t #格式化输出,升序排序

(6)数字计算

awk 'BEGIN{print 2+3}'
5
awk 'BEGIN{print 2*3}'
6

awk中变量不需要定义就可以直接使用,作为处理时未定义的变量,默认值为空,最为数字处理是未被定义的默认值为0

(7)循环计数

i++ = i+=1 = i=i+1
awk '/bash$/;{x++};END{print x}'/etc/passwd
#逐行读取/etc/passwd文件,X初始值为0,匹配到以bash结尾的行自加1,最后打印x值,此处表明以bash结尾的共有5行

2.awk的if条件判断

(1)AWK条件判断(单分支)

结构为:if(条件判断){动作指令序列;}

(1.1)查询CPU占比大于0.5的就打印一整行

[root@localhost ~]# ps -eo user,pid,pcpu,comm |awk '{if ($3 >= 0.5) {print $0}}'
[root@localhost ~]# ps -eo user,pid,pcpu,comm |awk '{if ($3 >= 0.1) {print $0}}'
root          1  0.1 systemd
root         20  0.1 kworker/0:1
#没有大于0.5的进程所以换成了大于等于0.1

(2)双分支if结构

语法格式:if(条件判断){动作指令1;} else {动作指令2;}

(2.1)UID大于等于1000的为普通用户,小于1000的是系统用户

[root@localhost ~]# awk -F: '{if ($3>=1000){print "普通用户有:"  $1} else {print "系统用户有:"$1}}' /etc/passwd
系统用户有:root
系统用户有:bin
系统用户有:daemon
系统用户有:adm
系统用户有:lp
系统用户有:sync
系统用户有:shutdown
系统用户有:halt
系统用户有:mail
系统用户有:operator
系统用户有:games
系统用户有:ftp
系统用户有:nobody
系统用户有:systemd-network
系统用户有:dbus
系统用户有:polkitd
系统用户有:tss
系统用户有:postfix
系统用户有:chrony
系统用户有:sshd
普通用户有:zhangsan

(3)多分支if结构

if结构语句:if (条件判断){动作指令1;} else if (条件判断2){动作指令2;}else{动作指令N;}

(3.1)/etc/passwd第三段为14就输出用户名else如果是99就是nobogy用户else其他用户全部输出呵呵呵

[root@localhost ~]# awk -F: '{if ($3==14){print $1} else if ($3==99){print "这是nobody用户"} else {print "呵呵呵"}}' /etc/passwd
呵呵呵
呵呵呵
呵呵呵
呵呵呵
呵呵呵
ftp
这是nobody用户
呵呵呵
呵呵呵

(4)awk数组与循环(相当于python中的列表)

语句语法:for 变量 in 数组名{动作指令}

(4.1)

特别像python中的列表
例:qwe=["12","123","1234"]
[root@localhost ~]# awk 'BEGIN{a[0]=11;a[1]=12;print a[0],a[1]}'
11 12

(5)for循环:

for循环语法:for(表达式1;表达式2;表达式3;){动作指令序列}

(5.1)使用for循环在1~10的数里输出,但不能输出3,6,8

[root@localhost ~]# awk 'BEGIN{for(i=1;i<=10;i++) {if(i==3||i==6||i==8){contiune}else{print i}}}'
1
2
4
5
7
9
10

(6)while循环

while循环语法:while(条件判断){动作指令序列}

(6.1)使用while循环10个数但不要3,6,8

[root@localhost ~]# awk 'BEGIN{while(i<=10){if(i==3||i==6||i==8){i++;contiune}else{print i;i++}}}'1
2
4
5
7
9
10

(7)contiune,break,exit的解释

contiune 跳过此循环
break 结束最里面的循环
exit 退出脚本

(8)查看并统计端口状态,输出它们的数量

[root@localhost ~]# netstat -nat | awk '/^tcp/{++State[$NF]} END {for(i in State) {print i,State[i]}}'
LISTEN 4
ESTABLISHED 1

对文件中的命令进行排序(sort),统计(uniq),分割(cut).

一. SORT的解释单纯的,SORT依照开头字符,默认为升序

-u 去除重复行
-r 依照开头字符,排列的降序
-o 输出到另一个文件
-m 将文件中的文本合并并输出
-n 将文件中的字符,数字,合成一个整体进行排序
-t

分隔符,配合-k可以进行对第""列进行排序   就像awk ,-t " " 以空格为分隔符

例如:

[root@localhost ~]# cat 1234.txt
11 1
12 2
15 7
14 4
13 6
19 5
17 3
[root@localhost ~]# sort -k2 -t " " 1234.txt
11 1
12 2
17 3
14 4
19 5
13 6
15 7

2.UNIQ文件名,去掉连续重复的内容

uniq  文件名 去掉连续重复的内容
-u         去掉重复内容
-c 统计连续出现的次数

3.CUT命令详解(cut是纵向处理)

(1).

cut
-b 字节(每个汉字为3个字节,没个英文为1按字节)
-c 字段(每个汉字为一字段,每个英文单词为一字段)
-f 字符(每个字符为一个整体,空格隔开的就为另一个整体)

(2).表示范围的方法还有:

N 只有第N项
N- 从第N项一直到行尾巴
-M 从行首一直到M(包括M)
N-M 从第N行开始到M项(包括M)
--output-delimiter=$'\n' 换行符

例如:

[root@localhost ~]# cat 123.txt
11 123
22 1234
hello,world
11 123
23 43121
444 4312
444 4321
hello,world
22 54321
111 2143
1q
·:“··1 2134
gad
gaad
gaaad
gaaaad
gaaaaad
gaaaaaad
gaaaaaaad
郭子林
[root@localhost ~]# cut -b1-3 123.txt   #-b 字节 #1-3从一字节到3字节
11
22
hel
11
23
444
444
hel
22
111
1q
·
gad
gaa
gaa
gaa
gaa
gaa
gaa
郭

又一个例子:

[root@localhost ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# head -1 /etc/passwd |cut -d ":" -f 1,6,7 --output-delimiter=$'\n'
root
/root
/bin/bash

shell的一些基础相关推荐

  1. shell脚本的基础知识

    shell脚本的基础知识 1 什么是shell 2 shell脚本的意义 3 如何创建shell脚本 4 如何执行shell脚本 5如何对脚本脚本进行调试 6 脚本练习 1 什么是shell shel ...

  2. shell常用的基础命令

    shell常用的基础命令 1 diff命令 2 patch命令 3 cut命令 4 sort命令 5 uniq 命令 6 tr命令 7 &&和 || 8 test命令 8.1 test ...

  3. shell脚本由基础变量及特殊变量($@、$*、$#等)到实战。

    shell脚本由基础变量及特殊变量($@.$*.$#等)到实战. 一.shell脚本建立: shell脚本通常是在编辑器(如vi/vim)中编写,也可以在命令行中直接执行: 1.脚本开头:     规 ...

  4. linux基础—课堂随笔_03 SHELL脚本编程基础

    shell脚本编程基础 条件选择:if语句 选择执行: 注意:if语句可嵌套 单分支 if(开头)判断条件:then 条件为真的分支代码  fi(结尾) 双分支 if(开头)判断条件:then 条件为 ...

  5. 详细介绍Linux shell脚本系列基础学习(列表)

    本系列适合Linux初学者,属于Linux入门级教程,主要介绍了Shell的分类.语法格式以及脚本的使用和编写格式等. 不断更新中,是Shell学习的必读经典教程.现主要包含以下文章: Linux S ...

  6. linux sh 必要,Linux Shell学习之基础篇(不适合学习,仅为本人笔记)

    在学习Linux和OpenStack过程中,感觉不管是大规模部署部署还是运维,Shell脚本都已经是标配,所以学好脚本很有必要. 以下仅为Linux Shell的一些基础笔记,这里作为笔记记下. == ...

  7. Linux Shell脚本编程基础

    2 Linux Shell脚本编程基础 发表于: Linux, Shell, UNIX, 资源分享 | 作者: 谋万世全局者 标签: Linux,Shell,编程基础,脚本 本文作者:Leal 授权许 ...

  8. 《Linux C编程从入门到精通》——1.3 Shell的使用基础

    本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.3节,作者:宋磊 , 程钢著,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.3 S ...

  9. 《Linux C编程从入门到精通》一1.3 Shell的使用基础

    本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.3节,作者 宋磊 , 程钢,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.3 Sh ...

  10. SHELL 脚本编程基础

    目录 前言 一. shell 概述 1.1 shell 和 shell 脚本 1.1.1 什么是shell 1.1.2 shell的作用 1.1.3 shell脚本是什么 1.1.4 shell脚本能 ...

最新文章

  1. 什么是php伪静态规则,php设置伪静态规则编写 问题
  2. 国内可用的NTP服务器地址列表 网络时间 服务器
  3. Android开发--源码学习
  4. 事务回滚什么意思 try_三问Spring事务:解决什么问题?如何解决?存在什么问题?...
  5. windows下安装virtual box(ubuntu)
  6. R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)
  7. 【爬虫】爬取带有cookie才能获取网页内容的新闻网站
  8. ABAP--动态创建类型和变量的使用程序样例
  9. 隔行变色( 表格隔行变色 + LI 浮动隔行变色 )
  10. ~~遗传算法最最最最简单的实例~~
  11. Linux常用快捷键汇总
  12. 2022 年海峡两岸无线科学与技术会议
  13. 计组_指令周期/机器周期(cpu周期)/时钟周期(节拍T) 主频超频/cpu频率发热
  14. 十载寒冰,难凉热血——2020CSDN年度博客之星Top10心路历程
  15. c++常对象和常成员函数详解
  16. Win10卸载CUDA 10.2
  17. linux服务器防攻击脚本,防止服务器被攻击的妙招(推荐)
  18. 【大数据开发】大数据开发的一些基本概念
  19. windows10怎么备份操作系统
  20. Visual Studio 2019的下载及安装

热门文章

  1. 我国著名的计算机科学家,我国著名计算机科学家、西安交大郑守淇教授逝世
  2. ResponseBodyAdvice的使用
  3. linux 字符界面 office,Linux系统下对比永中office和wps的界面及字体,附对比图
  4. Word文档如何设置成不可编辑的模式?
  5. oracle ko16mswin949,PRM DUL Oracle数据库恢复的最后一步
  6. SQLServer 自定义函数 日期计算月初/月末/年初/年末/季初/季末
  7. 客服如何提高工作效率
  8. s+清辅音,读作对应的浊辅音
  9. 手把手教你如何利用Meterpreter渗透Windows系统
  10. 手把手教你美国亚马逊直购