shell的一些基础
什么是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的一些基础相关推荐
- shell脚本的基础知识
shell脚本的基础知识 1 什么是shell 2 shell脚本的意义 3 如何创建shell脚本 4 如何执行shell脚本 5如何对脚本脚本进行调试 6 脚本练习 1 什么是shell shel ...
- shell常用的基础命令
shell常用的基础命令 1 diff命令 2 patch命令 3 cut命令 4 sort命令 5 uniq 命令 6 tr命令 7 &&和 || 8 test命令 8.1 test ...
- shell脚本由基础变量及特殊变量($@、$*、$#等)到实战。
shell脚本由基础变量及特殊变量($@.$*.$#等)到实战. 一.shell脚本建立: shell脚本通常是在编辑器(如vi/vim)中编写,也可以在命令行中直接执行: 1.脚本开头: 规 ...
- linux基础—课堂随笔_03 SHELL脚本编程基础
shell脚本编程基础 条件选择:if语句 选择执行: 注意:if语句可嵌套 单分支 if(开头)判断条件:then 条件为真的分支代码 fi(结尾) 双分支 if(开头)判断条件:then 条件为 ...
- 详细介绍Linux shell脚本系列基础学习(列表)
本系列适合Linux初学者,属于Linux入门级教程,主要介绍了Shell的分类.语法格式以及脚本的使用和编写格式等. 不断更新中,是Shell学习的必读经典教程.现主要包含以下文章: Linux S ...
- linux sh 必要,Linux Shell学习之基础篇(不适合学习,仅为本人笔记)
在学习Linux和OpenStack过程中,感觉不管是大规模部署部署还是运维,Shell脚本都已经是标配,所以学好脚本很有必要. 以下仅为Linux Shell的一些基础笔记,这里作为笔记记下. == ...
- Linux Shell脚本编程基础
2 Linux Shell脚本编程基础 发表于: Linux, Shell, UNIX, 资源分享 | 作者: 谋万世全局者 标签: Linux,Shell,编程基础,脚本 本文作者:Leal 授权许 ...
- 《Linux C编程从入门到精通》——1.3 Shell的使用基础
本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.3节,作者:宋磊 , 程钢著,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.3 S ...
- 《Linux C编程从入门到精通》一1.3 Shell的使用基础
本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.3节,作者 宋磊 , 程钢,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.3 Sh ...
- SHELL 脚本编程基础
目录 前言 一. shell 概述 1.1 shell 和 shell 脚本 1.1.1 什么是shell 1.1.2 shell的作用 1.1.3 shell脚本是什么 1.1.4 shell脚本能 ...
最新文章
- 什么是php伪静态规则,php设置伪静态规则编写 问题
- 国内可用的NTP服务器地址列表 网络时间 服务器
- Android开发--源码学习
- 事务回滚什么意思 try_三问Spring事务:解决什么问题?如何解决?存在什么问题?...
- windows下安装virtual box(ubuntu)
- R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)
- 【爬虫】爬取带有cookie才能获取网页内容的新闻网站
- ABAP--动态创建类型和变量的使用程序样例
- 隔行变色( 表格隔行变色 + LI 浮动隔行变色 )
- ~~遗传算法最最最最简单的实例~~
- Linux常用快捷键汇总
- 2022 年海峡两岸无线科学与技术会议
- 计组_指令周期/机器周期(cpu周期)/时钟周期(节拍T) 主频超频/cpu频率发热
- 十载寒冰,难凉热血——2020CSDN年度博客之星Top10心路历程
- c++常对象和常成员函数详解
- Win10卸载CUDA 10.2
- linux服务器防攻击脚本,防止服务器被攻击的妙招(推荐)
- 【大数据开发】大数据开发的一些基本概念
- windows10怎么备份操作系统
- Visual Studio 2019的下载及安装
热门文章
- 我国著名的计算机科学家,我国著名计算机科学家、西安交大郑守淇教授逝世
- ResponseBodyAdvice的使用
- linux 字符界面 office,Linux系统下对比永中office和wps的界面及字体,附对比图
- Word文档如何设置成不可编辑的模式?
- oracle ko16mswin949,PRM DUL Oracle数据库恢复的最后一步
- SQLServer 自定义函数 日期计算月初/月末/年初/年末/季初/季末
- 客服如何提高工作效率
- s+清辅音,读作对应的浊辅音
- 手把手教你如何利用Meterpreter渗透Windows系统
- 手把手教你美国亚马逊直购