shell笔记

之前有段时间在学习shell脚本,又重新理了一下知识点,自这里记录一下,方便以后查找

 


 

用户管理:

1.查看user1用户信息

id user1

2.添加用户

useradd user1

3.删除用户

userdel -r user1

4.修改用户密码

passwd user1

用户与组

1.把用户加入组

apasswd -a user1 root # 把用户user1 加入到 root组

2.把组中用户删除

apasswd -d user1 root # 把用户user1 移除 root组

3.chmod 权限分配:
r 4 读
w 2 写
x 1 执行

数字加起来都是没有重复的,所以可以直接用数值之和表示权限

1.chmod u+x file
2.chmod 755 file

acl设置权限:
1.setfacl 添加acl权限:

setfacl -m u:user1:rwx file.txt

2.getfacl 查看acl权限

getfacl file.txt

3.setfacl 删除acl权限:

setfacl -x u:user1:rwx file.txt

4.清空acl权限

setfacl -b file.txt

5.创建和删除文件权限
#需要对目录设置acl权限即可

setfacl -m u:user1:rwx /opt

6.如何对目录及子目录和文件设置acl权限

setfacl -m u:user1:rwx -R /opt/

7.目录中后期添加的子目录和文件如何继承父目录的权限

setfacl -m d:u:user1:rwx /opt/

设置用户对命令的执行权限-visudo:
1.设置

visudo
user1 localhost=/usr/sbin/useradd,usr/abin/uaerdel

2.使用有密码sudo授权命令

sudo localhost=/usr/sbin/useradd user1
sudo localhost=/usr/sbin/useradd -r user1

3.使用无密码sudo授权命令

sudo localhost=NOPASSWD: /usr/sbin/useradd user1
sudo ALL=NOPASSWD: /usr/sbin/useradd -r user1

执行shell脚本的方式:

bash tesh.sh #第1种
#脚本中不需要写解析器,但是要在命令前说明使用的是哪种解释器(如bash)
#不需要写给脚本设置执行权限
./tesh.sh # 第2种
#需要在脚本第一行写解析器 #!/bin/bash
#需要写给脚本设置执行权限

查看目录下的所有文件和目录的详细信息

ls -lhR /opt/

设置定时任务

crontab -e

#每周五下午17:30执行/opt/war/test.sh

30 17 * * 5 /opt/war/test.sh
分 时 日 月 周

shell变量的种类

用户自定义的变量:有用户自己定义、修改和使用
预定义变量:bash预定义的特殊变量,不能直接修改
位置变量:通过命令行给程序传递执行参数

双引号:“” 允许通过$符号引用其他变量值
单引号:‘’ 禁止引用其他变量,$视为普通字符
反引号:`` 将命令结果输出给变量

从键盘输入内容为变量赋值
格式:read -p "信息" 变量名

$#:命令的参数个数
$*:所有位参数的内容
$?:上一条命令执行后返回的状态,返回0表示正常,非0表示异常
$0:当前执行的进程/程序名

键盘输入参数
$n # n为1-9的数字,位置变量只能有9个

计算整数表达式的运算结果
格式:expr 变量1 运算符 变量2
expr的常用运算符
加法:+
减法:-
乘法:\*
除法:/
求模(取余):%
例子:expr 20 + 30

echo 命令详解:
-e #可以解析引号内的转移字符
-n #不换行

echo -e "1234\n456" #-e可以解析引号内的转移字符 输出为:
123
456
echo -e "\033[32;47m[输出内容]\033[0m"

字符颜色 背景颜色
30 黑色 40 黑色
31 红色 41 红色
32 绿色 42 绿色
33 棕色 43 棕色
34 蓝色 44 蓝色
35 紫色 45 紫色
36 青色 46 青色
37 白色 47 白色

cat 查看文件全部内容
tee 输出一份保存一份如:

./test.sh |tee logs.txt

more 可翻页查看文件内容
head 查看前10行 -n 指定行数
tail 最后10行 -n 指定行数
nl 把输出上行号如:

./test.sh | nl

#指定格式输出,x处可更换任意字符,表示标记如下:

cat<<x

123432423
x

test命令

格式:test 条件表达式 [条件表达式]
#测试特定表达式是否成立,成立式返回0,否则为其他值

常见的测试类型

1.测试文件状态
格式:[操作符 文件或目录]
-d:测试是否为目录
-f:测试是否为文件
-e:测试目录或文件是否存在
-r:测试当前用户是否有读取权限
-w:测试当前用户是否有写入权限
-x:测试当前用户是否有执行权限
-L:测试是否为符号链接(link)文件

2.字符串比较

格式[字符串1 = 字符串2]
[字符串1 != 字符串2]
[-z 字符串]
-=:字符串内容相同
-!=:字符串内容不同,!为取反的意思
-z:字符串内容为空

3.整数值比较

格式:[整数1 操作符 整数2]
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于等于(Lesser or Equal)
-ge:大于等于(Greater or Equal)

4.逻辑测试

格式[表达试1]操作符[表达式2]
-a 或 &&:逻辑与,而且的意思
-o 或||:逻辑或,或者的意思
!:逻辑否

who 命令 列出有多少用户登陆系统
-------------------------------------

if判断语句格式:

if [];then
  echo ""
elif
  echo ""
else
  echo ""
fi

for循环语句格式:多适用与文件接轨的时候

for 变量名 in 取值列表
do
    echo ""
done
-------------------------------------
for ((i=0;i<10;i++))
do
    echo ""
done

 

case 循环语句格式:

case $1 in
  start)
    echo ""
  ;;
  stop)
    echo ""
  ;;
  *)
    echo ""
  ;;
easc

while循环语句格式,适用于数字循环

while [ $# -eq 0 ]
do
  echo ""
  shift #适用迁移位置变量将$1-$9依次像左传递
  continue #结束本次循环
  echo ""
  break # 跳出循环,通常在循环语句与条件语句一起使用
done
echo '123'|passwd --stdin user1 #把”123“作为密码输入给user1

定义函数

function 函数名{
  命令序列
}
# 调用函数时,直接写出函数名称即可 函数名 参数1 参数2

文本操作

1.在当前目录下找到以txt结尾的文件

find . -name ".txt"

2.在当前目录下找到所有字母开头的文件

find . -name "[a-z]*"

3.在/etc目录下找到所有host开头的文件

find /etc -nam "host*"

4.在当前目录下找属性为755的文件

find . -perm 755

5.在当前目录下找属组为root的文件

find -user root

6.在当前目录下找更改时间在5天以内的文件

find . -mtime -5

7.在当前目录下找更改时间在3天前的文件

find . -mtime +3

8.在当前目录下找文件类型为d的目录文件

find .-type d

9.在当前目录下找文件类型为l的链接文件

find . -type l

10.在当前目录下查找文件大小大于1M的文件,1M是1000000个字节

find . -size +1000000c

11.找出当前目录下的所有权限为700的文件,并把其权限重设为777

find .-perm 700|xargs chmod 777

12.查找出文件并查看其详细信息

find . -type f | xargs ls -l

正则表达式

1. ^linux #以linux开头的行
2. $linux #以linux结尾的行
3. . #匹配任意单字符
4. .+ #匹配任意多字符
5. .*匹配0个或多个字符
6. [0-9a-z] #匹配[]内任意一个字符
7. (linux)+ #出现多次linux单词
8. (linux){2} #web 出现了两次以上
9. \ #用来屏蔽一个元字符的特殊含义

grep搜索文件内容
格式:grep 参数 "条件适用正则表达式" 文件名
-c:统计行数
-n:显示行号
-e:不区分大小写
-v:取反
-E: grep增强模式 可以使用正则表达式了

grep "qq" * #文件中有qq的行
grep -c "file" file #有多少行匹配到了file,-n为显示行号
grep -E "2004:22:5[0-9]" logs.txt #查找时间在2004:22:50到2004:22:59所在的行
grep -E "^[^210]" file #查找不包含2或1或0的行
grep -E "h*p" file #查找包含h和p的行 grep -E "[5-8][6-9][0-3]" file #查找大于560小于893的行 grep -E "4{2}" file #查找包含两个4的行 grep -E "4{2,}" file #查找大于两个4的行.

grep -E "4{2,4}" file #查找大于2个4,小于4个4的行 grep -E "^$}" file #查找文件的空行 cut -d: -f1 #以:分隔取第一列 awk -F: {print $1,$2} #以:分隔取第一列

awk编程使用

1.查找文件中的每一列

awk '{print $0}' file.txt

2.查找第1列和第7列

awk '{print $1 "\t"$7}' file.txt

3.~匹配192.18.8.1的IP地址的统计,!~为不匹配

cat file | awk '$0 !~/192.168.8.1/'|grep "php"|wc -l

4.以至少两个的空格为分隔符,打印第二列数据

[root@localhost ~]# docker ps|awk -F '[ ]{2}*' '{print $2}'
IMAGE
sims_gis_scenic_map:5.0.12
guide_tours:0.2.9
touch_screens_map_server:0.1.2
mzl_touch_screen:0.1.1
guide_tourmap:0.4.4

sed工具

1.打印从包含sshd的行到最后一行

cat file | sed -n '/sshd/,$'p

2.只打印第二行,不打印其他行

sed -n '2'p file

3.打印从第1-4行

sed -n '1,4'p file

4.打印匹配los的行

sed -n '/los/'p file

5.打印第4行到los的行

sed -n '4,/los/'p file

6.把第一行到第二行全部删除

sed1,2’d file

uniq行定位只能识别紧挨着的行

1.打印紧挨着的重复出现的次数

uniq -c file

2.只打印重复的行

uniq -d file

3.把文件中第一列取出来,排序,统计重复的行数(sort为排序)

awk '{print $1}' /opt/file.loog | sort | uniq -c 

sort行排序

1.把文件按照字母 升序排序

sort file

2.把文件按照字母 降序排序

sort -r file

3.以:分隔按照第一列 降序排序

cat file | sort -t: -k1 -r 

split 文件分割

1.将file文件没两行切割一个文件spt为切割后的文件

split -2 file spt

将连续的空格转换成一个方法

[root@oracle6 ~]# echo "a b c d" | sed 's/[ ][ ]*/ /g'
a b c d
[root@oracle6 ~]# echo "a b c d" | awk '{$1=$1;print}'
a b c d
[root@oracle6 ~]# echo "a b c d" | tr -s ' '
a b c d

设置脚本开机自启动方法:
一.将脚本启动命令放入/etc/rc.d/rc.local文件中即可

二.使用系统级别启动方式
将脚本放入到/etc/rc.d/init.d中后(脚本不需要使用.sh结尾),可以使用service <脚本名称> <参数>启动脚本
1.利用service启动test

service test start

2.设置开机自动启动需要再脚本中添加如下两行

# chkconfig: 2345 10 90
# description: Activates/Deactivates all network interfaces configured to \

chkconfig --add test 添加系统列表
chkconfig test on/off //开启or关闭 重启后永久生效

#监测服务是否正常,并将结果发送邮件给用户

nc -w 3 192.168.8.225 3306 &>/dev/null
if [];then
  str="服务器正常运行!!!"
else
  str="服务器无响应!!!"
fi

echo $str|mail -s '邮件主题' zhshan@handsmap.cn

创建一个10G大小的空文件 占用实质空间 像一个新磁盘

fallocate -l 10G file.txt

删除除了file1以外的文件

shopt -s extglob #(打开extglob反选模式)
rm -fr !(file1)
rm -rf !(file1|file2)

gzip -c | grep name # 在压缩包中搜索name

 

posted @ 2020-09-27 15:16  子寒子寒  阅读(238)  评论(0)    收藏  举报