shell从入门到精通

系列文章目录

shell从入门到精通

shell从入门到精通

  • 系列文章目录
  • 一、diff 用法 (一般作补丁,用补丁的方式更新脚本)
    • 1.1参数a添加
    • 1.2 参数c更改
    • 1.3参数d删除
    • 1.4参数a和d的对比
    • 1.5参数b(忽略空格)
    • 1.6 参数B(忽略空行)
    • 1.7 参数i(忽略大小写)
    • 1.8 参数c(显示文件所有内容并标识不同)
    • 1.9参数r(对比目录)
    • 1.10 -u参数 合并输出 (生成补丁)
  • 二、path命令
  • 三、cut用法 截取数据
  • 四、sort 排序
  • shell脚本常用基础命令1
  • 一、 uniq指令
    • 1.1参数c(对于顺序的合并重复并且统计个数)
    • 1.2uniq和sort配合使用(合并重复并统计重复个数)
    • 1.3参数d(显示重复的行)
    • 1.4参数u(显示唯一的行)
    • 1.5抓取出现数字最多的数字(不含重复出现最多数字一样)
    • 1.6抓取网卡的ip
  • 二、tr用法
  • 三、shell脚本条件
  • 四、test指令
    • 4.1test用法
    • 4.2test的条件关系
  • 五、脚本应用
    • 5.1执行脚本来判断用户的类型
    • 5.2执行脚本判断文件类型
  • shell脚本常用基础命令2
  • 一、grep用法
  • 二、sed用法
    • 2.1p参数 (显示)n参数(只显示处理过的行)
  • 系列文章目录
  • 一、awk用法
  • 二、 awk用法练习
  • 三、书写脚本通过用户文件建立用户
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本


# shell脚本常用基础命令1

shell脚本常用基础命令

  • 系列文章目录
  • 一、diff 用法 (一般作补丁,用补丁的方式更新脚本)
    • 1.1参数a添加
    • 1.2 参数c更改
    • 1.3参数d删除
    • 1.4参数a和d的对比
    • 1.5参数b(忽略空格)
    • 1.6 参数B(忽略空行)
    • 1.7 参数i(忽略大小写)
    • 1.8 参数c(显示文件所有内容并标识不同)
    • 1.9参数r(对比目录)
    • 1.10 -u参数 合并输出 (生成补丁)
  • 二、path命令
  • 三、cut用法 截取数据
  • 四、sort 排序
  • shell脚本常用基础命令1
  • 一、 uniq指令
    • 1.1参数c(对于顺序的合并重复并且统计个数)
    • 1.2uniq和sort配合使用(合并重复并统计重复个数)
    • 1.3参数d(显示重复的行)
    • 1.4参数u(显示唯一的行)
    • 1.5抓取出现数字最多的数字(不含重复出现最多数字一样)
    • 1.6抓取网卡的ip
  • 二、tr用法
  • 三、shell脚本条件
  • 四、test指令
    • 4.1test用法
    • 4.2test的条件关系
  • 五、脚本应用
    • 5.1执行脚本来判断用户的类型
    • 5.2执行脚本判断文件类型
  • shell脚本常用基础命令2
  • 一、grep用法
  • 二、sed用法
    • 2.1p参数 (显示)n参数(只显示处理过的行)
  • 系列文章目录
  • 一、awk用法
  • 二、 awk用法练习
  • 三、书写脚本通过用户文件建立用户
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本


一、diff 用法 (一般作补丁,用补丁的方式更新脚本)

Usage: diff [OPTION] files|dir

输出信息:
【num1,num2】a|c|d 【num3,num4】
之前是第一个文件的行
之后是第二个文件的行
a 添加
c 更改
d 删除
<第一个文件的内容
">"第二个文件的内容

1.1参数a添加

[root@docker3 mnt]# vim yan
[root@docker3 mnt]# cat yan > yan1
[root@docker3 mnt]# ls
yan  yan1
[root@docker3 mnt]# vim yan1
[root@docker3 mnt]# cat yan
hello yan
[root@docker3 mnt]# cat yan1
hello yan
123
[root@docker3 mnt]# diff yan yan1
1a2
> 123

1.2 参数c更改

[root@docker3 mnt]# vim yan
[root@docker3 mnt]# cat yan
hello yan
456
[root@docker3 mnt]# cat yan1
hello yan
123
[root@docker3 mnt]# diff yan yan1
2c2
< 456
---
> 123
[root@trade shell]# diff yan yan1
1,2c1,2
< hello yan
< 123
---
> Ahello yan
> 456
[root@docker3 mnt]# cat yan
Ahello yan
456
123
[root@docker3 mnt]# cat yan1
hello yan
123
000
[root@docker3 mnt]# diff yan yan1
1,2c1
< Ahello yan
< 456
---
> hello yan
3a3
> 000

1.3参数d删除

[root@docker3 mnt]# cat yan
hello yan
[root@docker3 mnt]# cat yan1
hello yan
123
[root@docker3 mnt]# diff yan1 yan
2d1
< 123

1.4参数a和d的对比

[root@trade shell]# cat yan
yan
[root@trade shell]# cat yan1
yan
123
[root@trade shell]# diff yan yan1
1a2
> 123
[root@trade shell]# diff  yan1 yan
2d1
< 123

常用参数

-b 忽略空格-B忽略空行
-i忽略大小写-c显示文件所有内容并标识不同
-r对比目录-u合并输出

1.5参数b(忽略空格)

[root@docker3 mnt]# cat yan
hello yan
[root@docker3 mnt]# cat yan1
hello   yan
[root@docker3 mnt]# diff yan yan1
1c1
< hello yan
---
> hello   yan
[root@docker3 mnt]# diff -b yan yan1

1.6 参数B(忽略空行)

[root@docker3 mnt]# cat yan
hello yan
空行
[root@docker3 mnt]# cat yan1
hello yan
[root@docker3 mnt]# diff yan yan1
2d1
< 
[root@docker3 mnt]# diff -B yan yan1

1.7 参数i(忽略大小写)

[root@docker3 mnt]# cat yan 
Hello yan
[root@docker3 mnt]# cat yan1
hello yan
[root@docker3 mnt]# diff yan yan1
1c1
< Hello yan
---
> hello yan
[root@docker3 mnt]# diff -i yan yan1

1.8 参数c(显示文件所有内容并标识不同)

[root@docker3 mnt]# cat yan
123
456
Hello yan
123
1234
[root@docker3 mnt]# cat yan1
123
456
Hello yan
o23
1234
[root@docker3 mnt]# diff yan yan1
4c4
< 123
---
> o23
[root@docker3 mnt]# diff -c yan yan1
*** yan	2022-02-17 06:33:56.176000000 +0800
--- yan1	2022-02-17 06:34:12.207000000 +0800
***************
*** 1,5 ****123456Hello yan
! 1231234
--- 1,5 ----123456Hello yan
! o231234

1.9参数r(对比目录)

[root@docker3 mnt]# mkdir yan2 yan3
[root@docker3 mnt]# touch yan2/yan
[root@docker3 mnt]# diff -r yan2 yan3
Only in yan2: yan

1.10 -u参数 合并输出 (生成补丁)

[root@docker3 mnt]# cat yan
123
456
Hello yan
123
1234
[root@docker3 mnt]# cat yan1
123
456
Hello yan
o23
[root@docker3 mnt]# diff -u yan yan1
--- yan	2022-02-17 06:33:56.176000000 +0800
+++ yan1	2022-02-17 06:34:12.207000000 +0800
@@ -1,5 +1,5 @@123456Hello yan
-123
+o231234
[root@docker3 mnt]# diff -u yan yan1 > yan.path

二、path命令

path用法 打补丁
patch 原文件 补丁文件
-b 备份原文件

[root@docker3 mnt]# yum install patch -y
[root@docker3 mnt]# patch -b yan yan.path 
[root@docker3 mnt]# cat yan
123
456
Hello yan
o23
1234
[root@docker3 mnt]# cat yan.path 
--- yan	2022-02-17 06:33:56.176000000 +0800
+++ yan1	2022-02-17 06:34:12.207000000 +0800
@@ -1,5 +1,5 @@123456Hello yan
-123
+o231234
[root@docker3 mnt]# cat yan.orig -b备份的原文件
123
456
Hello yan
123
1234

三、cut用法 截取数据

cut
-d : 指定:为分割符
-f 指定显示的列 5第五列 | 3,5第三列和第五列 | 3-5第三列到第五列 | 5- 第五列以后 | -5 到第五列
-c 指定截取字符,(用数字用法和-f一样)
取出第五行

[root@docker3 mnt]# cp /etc/passwd .
[root@docker3 mnt]# head -n 5 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
[root@docker3 mnt]# head -n 5 passwd | tail -n1
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

取出第五列

[root@docker3 mnt]# cut -d : -f 5 passwd 
root
bin
daemon
adm
lp
sync
shutdown
halt
games

第一列和第五列

[root@docker3 mnt]# cut -d : -f 1,5 passwd 
root:root
bin:bin
daemon:daemon
adm:adm
lp:lp
sync:sync
shutdown:shutdown
halt:halt
games:games
[root@docker3 mnt]# cut -c1-4 passwd 
root
bin:
daem
adm:
lp:x
sync
shut
halt
game
tss:

四、sort 排序

-n 纯数字排序
-r 倒序
-u 去掉重复
-o 输出到指定文件
-t 指定分割符
-k 指定排序的列

[root@docker3 mnt]# sort yan
1
123
13
2
3
4
7
81
81
[root@docker3 mnt]# sort -n yan
1
2
3
4
7
13
81
81
123
[root@docker3 mnt]# sort -rn yan
123
81
81
13
7
4
3
2
1
[root@docker3 mnt]# sort -rn yan -o hello
[root@docker3 mnt]# cat hello 
123
81
81
13
7
4
3
2
1
[root@docker3 mnt]# sort -n yan
a:1
a:123
a:13
a:2
a:3
a:4
a:7
a:81
a:81
[root@docker3 mnt]# sort -t : -k 2 -n yan
a:1
a:2
a:3
a:4
a:7
a:13
a:81
a:81
a:123
[root@docker3 mnt]# sort -un yan
1
2
3
4
7
13
81
123

END

shell脚本常用基础命令1


shell脚本常用基础命令

  • 系列文章目录
  • 一、diff 用法 (一般作补丁,用补丁的方式更新脚本)
    • 1.1参数a添加
    • 1.2 参数c更改
    • 1.3参数d删除
    • 1.4参数a和d的对比
    • 1.5参数b(忽略空格)
    • 1.6 参数B(忽略空行)
    • 1.7 参数i(忽略大小写)
    • 1.8 参数c(显示文件所有内容并标识不同)
    • 1.9参数r(对比目录)
    • 1.10 -u参数 合并输出 (生成补丁)
  • 二、path命令
  • 三、cut用法 截取数据
  • 四、sort 排序
  • shell脚本常用基础命令1
  • 一、 uniq指令
    • 1.1参数c(对于顺序的合并重复并且统计个数)
    • 1.2uniq和sort配合使用(合并重复并统计重复个数)
    • 1.3参数d(显示重复的行)
    • 1.4参数u(显示唯一的行)
    • 1.5抓取出现数字最多的数字(不含重复出现最多数字一样)
    • 1.6抓取网卡的ip
  • 二、tr用法
  • 三、shell脚本条件
  • 四、test指令
    • 4.1test用法
    • 4.2test的条件关系
  • 五、脚本应用
    • 5.1执行脚本来判断用户的类型
    • 5.2执行脚本判断文件类型
  • shell脚本常用基础命令2
  • 一、grep用法
  • 二、sed用法
    • 2.1p参数 (显示)n参数(只显示处理过的行)
  • 系列文章目录
  • 一、awk用法
  • 二、 awk用法练习
  • 三、书写脚本通过用户文件建立用户
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本


一、 uniq指令

1.1参数c(对于顺序的合并重复并且统计个数)

[root@trade shell]# cat yan
123
4
1
2
3
7
81
13
81
13
81
81
123
4
123
[root@trade shell]# uniq -c yan 1 1231 41 11 21 31 71 811 131 811 132 811 1231 41 123

1.2uniq和sort配合使用(合并重复并统计重复个数)

[root@docker3 mnt]# sort -n yan | uniq -c 1 21 31 41 71 132 811 123

1.3参数d(显示重复的行)

[root@docker3 mnt]# sort -n yan | uniq -d
81

1.4参数u(显示唯一的行)

[root@docker3 mnt]# sort -n yan | uniq -u
1
2
3
4
7
13
123

1.5抓取出现数字最多的数字(不含重复出现最多数字一样)

[root@trade shell]# cat yan
123
4
1
2
3
7
81
13
81
13
81
81
123
4
123
[root@trade shell]# sort -n yan | uniq -c1 11 21 32 41 72 134 813 123
[root@trade shell]# sort -n yan | uniq -c | sort -n -k 11 11 21 31 72 132 43 1234 81
[root@trade shell]# sort -n yan | uniq -c | sort -n -k 1 | tail -n14 81
[root@trade shell]# sort -n yan | uniq -c | sort -n -k 1 | tail -n 1 | cut -d " " -f 8
81

1.6抓取网卡的ip

[kiosk@foundation38 Desktop]$ ifconfig wlan0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.31.177  netmask 255.255.255.0  broadcast 192.168.31.255inet6 fe80::cd76:22a3:151a:9e8d  prefixlen 64  scopeid 0x20<link>ether b0:68:e6:99:ba:7d  txqueuelen 1000  (Ethernet)RX packets 34279  bytes 33490309 (31.9 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 21281  bytes 5558502 (5.3 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[kiosk@foundation38 Desktop]$ ifconfig wlan0 | head -n 2
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.31.177  netmask 255.255.255.0  broadcast 192.168.31.255
[kiosk@foundation38 Desktop]$ ifconfig wlan0 | head -n 2 | tail -n 1inet 192.168.31.177  netmask 255.255.255.0  broadcast 192.168.31.255
[kiosk@foundation38 Desktop]$ ifconfig wlan0 | head -n 2 | tail -n1 | cut -d " " -f 10
192.168.31.177

二、tr用法

tr用法
tr ‘a-z’ ‘A-Z’ 小写转换成大写
tr ‘A-Z’ ‘a-z’ 大写转换成小写

[root@docker3 mnt]# cat yan
hello
HELLO
[root@docker3 mnt]# tr 'l' 's' < yan
hesso
HELLO
[root@docker3 mnt]# tr 'a-z' 'A-Z' < yan
HELLO
HELLO
[root@docker3 mnt]# cat yan
hello
HELLO

三、shell脚本条件

&&条件成立则…(是)
||不成立则…(否)

[root@docker3 mnt]# ping -c1 -w1 172.25.254.3 &> /dev/null && echo 172.25.254.3 is up || echo 172.25.254.3 is down
172.25.254.3 is up
[root@docker3 mnt]# ping -c1 -w1 172.25.254.5 &> /dev/null && echo 172.25.254.5 is up || echo 172.25.254.5 is down
172.25.254.5 is down

四、test指令

4.1test用法

test是作比较的

test = [ ]
“test $a = $b” = [ " $a" = " $b" ]

test数字对比

=
!=
-eq 等于
-ne 不等于
-le 小于等于
-lt 小于
-ge 大于等于
-gt 大于

[root@docker3 mnt]# a=1
[root@docker3 mnt]# b=1
[root@docker3 mnt]# test "$a" = "$b" && echo yes || echo no
yes
[root@docker3 mnt]# a=2
[root@docker3 mnt]# test "$a" = "$b" && echo yes || echo no
no
[root@docker3 mnt]# [ "$a" = "$b" ] && ehco yes || echo no
no
[root@docker3 mnt]# [ ! "$a" = "$b" ] && echo yes || echo no
yes
[root@docker3 mnt]# [ ! "$a" -eq "$b" ] && echo yes || echo no
yes
[root@docker3 mnt]# [ ! "$a" -ne "$b" ] && echo yes || echo no
no
[root@docker3 mnt]# [  "$a" -ne "$b" ] && echo yes || echo no
yes
[root@docker3 mnt]# [  "$a" -le "$b" ] && echo yes || echo no
no
[root@docker3 mnt]# [  "$a" -lt "$b" ] && echo yes || echo no
no
[root@docker3 mnt]# [  "$a" -ge "$b" ] && echo yes || echo no
yes
[root@docker3 mnt]# [  "$a" -gt "$b" ] && echo yes || echo no
yes

4.2test的条件关系

-a 并且
-o 或者

[root@docker3 mnt]# [ "$a" -gt "0" -a "$a" -lt "10" ] && echo yes || echo no
yes
[root@docker3 mnt]# a=20
[root@docker3 mnt]# [ "$a" -gt "0" -a "$a" -lt "10" ] && echo yes || echo no
no
[root@docker3 mnt]# [ "$a" -gt "0" -o "$a" -lt "10" ] && echo yes || echo no
yes

test对空的判定
-n nozero判定内容不为空
-z zero判定内容为空

[root@docker3 mnt]# [ -z "$c" ] && echo yes || echo no
yes
[root@docker3 mnt]# [ -n "$c" ] && echo yes || echo no
no

五、脚本应用

5.1执行脚本来判断用户的类型

user_check.sh 用户
用户类型为
super user 0
system user 1-999
common user

$*表示脚本后面跟的所有字符串
在这里插入图片描述

[root@docker3 mnt]# sh user_check.sh 
error : Please input username
[root@docker3 mnt]# sh user_check.sh yan
yan is common user
[root@docker3 mnt]# sh user_check.sh root
root is super user
[root@docker3 mnt]# sh user_check.sh out
ERROR: out is not exist

5.2执行脚本判断文件类型

test对于文件类型的判定
-ef 文件节点号是否一致(硬链)
-nt 文件1是否比文件2新
-ot 文件1是否比文件2老
-d 目录
-S 套接字
-L 软连接
-e 存在
-f 普通文件
-b 快设备
-c 字符设备

[root@docker3 mnt]# [ -e "/mnt" ] && echo yes || echo no
yes
[root@docker3 mnt]# [ -d "/mnt" ] && echo yes || echo no
yes
[root@docker3 mnt]# [ -S "/mnt" ] && echo yes || echo no
no
[root@docker3 mnt]# [ -L "/mnt" ] && echo yes || echo no
no
[root@docker3 mnt]# [ -f "/mnt" ] && echo yes || echo no
no
[root@docker3 mnt]# [ -c "/mnt" ] && echo yes || echo no
no
[root@docker3 mnt]# [ "/mnt/yan" -ef "/mnt/yan1" ] && echo yes || echo no 
no
[root@docker3 mnt]# [ "/mnt/yan" -ef "/mnt/yan2" ] && echo yes || echo no 
yes
[root@docker3 mnt]# [ "/mnt/yan" -ot "/mnt/file" ] && echo yes || echo no 
no
[root@docker3 mnt]# [ "/mnt/yan" -nt "/mnt/file" ] && echo yes || echo no 
yes

执行脚本
file_check.sh在执行时
如果脚本后未指定检测文件报错“未检测文件,请指定”
如果脚本后指定文件不存在报错“此文件不存在”
当文件存在时请检测文件类型并显示到输出中
在这里插入图片描述
在这里插入图片描述

END

shell脚本常用基础命令2


shell脚本常用基础命令

  • 系列文章目录
  • 一、diff 用法 (一般作补丁,用补丁的方式更新脚本)
    • 1.1参数a添加
    • 1.2 参数c更改
    • 1.3参数d删除
    • 1.4参数a和d的对比
    • 1.5参数b(忽略空格)
    • 1.6 参数B(忽略空行)
    • 1.7 参数i(忽略大小写)
    • 1.8 参数c(显示文件所有内容并标识不同)
    • 1.9参数r(对比目录)
    • 1.10 -u参数 合并输出 (生成补丁)
  • 二、path命令
  • 三、cut用法 截取数据
  • 四、sort 排序
  • shell脚本常用基础命令1
  • 一、 uniq指令
    • 1.1参数c(对于顺序的合并重复并且统计个数)
    • 1.2uniq和sort配合使用(合并重复并统计重复个数)
    • 1.3参数d(显示重复的行)
    • 1.4参数u(显示唯一的行)
    • 1.5抓取出现数字最多的数字(不含重复出现最多数字一样)
    • 1.6抓取网卡的ip
  • 二、tr用法
  • 三、shell脚本条件
  • 四、test指令
    • 4.1test用法
    • 4.2test的条件关系
  • 五、脚本应用
    • 5.1执行脚本来判断用户的类型
    • 5.2执行脚本判断文件类型
  • shell脚本常用基础命令2
  • 一、grep用法
  • 二、sed用法
    • 2.1p参数 (显示)n参数(只显示处理过的行)
  • 系列文章目录
  • 一、awk用法
  • 二、 awk用法练习
  • 三、书写脚本通过用户文件建立用户
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本


文本处理三剑客:grep sed awk

一、grep用法

grep -E = egrep (扩展搜索正文表达式)
grep格式
grep 匹配条件 处理文件(很多正文表达式用不了) |表示或者

[root@docker3 mnt]# grep "bash|root" passwd 
[root@docker3 mnt]# egrep "bash|root" passwd 
root:x:0:0:root:/root:/bin/bash
test:root:test
operator:x:11:0:operator:/root:/sbin/nologin
yan:x:1000:1000::/home/yan:/bin/bash
[root@docker3 mnt]# grep -E "bash|root" passwd 
root:x:0:0:root:/root:/bin/bash
test:root:test
operator:x:11:0:operator:/root:/sbin/nologin
yan:x:1000:1000::/home/yan:/bin/bash
[root@docker3 mnt]# grep -e bash -e root passwd 
root:x:0:0:root:/root:/bin/bash
test:root:test
operator:x:11:0:operator:/root:/sbin/nologin
yan:x:1000:1000::/home/yan:/bin/bash

grep开启的是贪婪模式,要是不匹配前面的<,不匹配后面>

[root@docker3 mnt]# grep -E "root" passwd 
root:x:0:0:root:/root:/bin/bash
test:root:test
chroot
rootch
[root@docker3 mnt]# grep -E "\<root" passwd 
root:x:0:0:root:/root:/bin/bash
test:root:test
rootch
operator:x:11:0:operator:/root:/sbin/nologin
[root@docker3 mnt]# grep -E "\<root\>" passwd 
root:x:0:0:root:/root:/bin/bash
test:root:test
operator:x:11:0:operator:/root:/sbin/nologin

grep 前面加数字,表示该关键字前面后面几行都显示出来

[root@docker3 mnt]# grep chroot passwd 
chroot
[root@docker3 mnt]# grep -2 chroot passwd 
test:root:test
TEST:ROOT:TEST
chroot
rootch
operator:x:11:0:operator:/root:/sbin/nologin
[root@docker3 mnt]# grep -A2 chroot passwd 
chroot
rootch
operator:x:11:0:operator:/root:/sbin/nologin
[root@docker3 mnt]# grep -B2 chroot passwd 
test:root:test
TEST:ROOT:TEST
chroot

显示匹配的在第几行

[root@docker3 mnt]# grep -n chroot passwd 
12:chroot

反向过滤,除了chroot其它行都过滤出来,展示部分。

[root@docker3 mnt]# grep -v chroot passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
yan:x:1000:1000::/home/yan:/bin/bash

以^…开头,…¥以…结尾

[root@docker3 mnt]# grep -E "^root" passwd 
root:x:0:0:root:/root:/bin/bash
rootch
[root@docker3 mnt]# grep -E "bash$" passwd 
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
[root@docker3 mnt]# grep -E "ws" yan
ws
[root@docker3 mnt]# grep -E "w.s" yan
was
[root@docker3 mnt]# grep -E "w...s" yan
waaas
[root@docker3 mnt]# grep -E "w.*s" yan
ws
was
waaas
waaaas
waaaaas
wabababs
[root@docker3 mnt]# grep -E "w.?s" yan
ws
was
[root@docker3 mnt]# grep -E "w.+s" yan
was
waaas
waaaas
waaaaas
wabababs
[root@docker3 mnt]# grep -E "w.{3}s" yan
waaas
[root@docker3 mnt]# grep -E "w.{2,3}s" yan
waaas
[root@docker3 mnt]# grep -E "w.{,3}s" yan
ws
was
waaas
[root@docker3 mnt]# grep -E "w.{3,}s" yan
waaas
waaaas
waaaaas
wabababs
[root@docker3 mnt]# grep -E "wab{1,}s" yan
[root@docker3 mnt]# grep -E "w(ab){1,}s" yan
wabababs

脚本
请显示系统中能被su命令切换的用户名称
在这里插入图片描述

[root@docker3 mnt]# sh user_check.sh 
root
yan

二、sed用法

用来对文本的内容进行处理,修改的是模式空间(内存),真实的(磁盘中)
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件

对字符的处理
p 显示
d 删除
a 添加
n 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
i 插入,直接修改文件内容
c 替换
w 写入
r 整合文件

2.1p参数 (显示)n参数(只显示处理过的行)

[root@docker3 mnt]# sed -n 5p passwd 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@docker3 mnt]# vim rule
[root@docker3 mnt]# cat rule 
5p
[root@docker3 mnt]# sed -n -f rule passwd 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@docker3 mnt]# sed  '5p' fstab 
1
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011
[root@docker3 mnt]# sed  -n '5p' fstab 
#5
[root@docker3 mnt]# sed  -n '3,5p' fstab 
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
[root@docker3 mnt]# sed  -n '3p;5p' fstab 
# /etc/fstab3
#5

#开头的行以及不是#开头的行

[root@docker3 mnt]# sed -n '/^#/p' fstab 
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
[root@docker3 mnt]# sed -n '/^#/!p' fstab 
1
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011

^$空行

[root@docker3 mnt]# sed -n '/^#/!p' fstab | sed -n '/^$/!p'
1
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011

最后一行$p

[root@docker3 mnt]# sed -n '$p' fstab
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011
[root@docker3 mnt]# sed -n '5,$p' fstab
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011

显示行号,‘=’, '$='最后一行的行号(可以统计文件有多少行)

[root@docker3 mnt]# sed -n '$=' fstab 
11
[root@docker3 mnt]# sed -n -e '3p' -e '5p' fstab 
# /etc/fstab3
#5

d参数删除

[root@docker3 mnt]# sed 5d fstab 
1
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011
[root@docker3 mnt]# sed '3,5d' fstab 
1
#2
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011
[root@docker3 mnt]# sed '3d;5d' fstab 
1
#2
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011
[root@docker3 mnt]# sed '/^#/d' fstab 
1
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011

a参数添加

[root@docker3 mnt]# sed '/^#/ahello' fstab 
1
#2
hello
# /etc/fstab3
hello
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
hello
#5
hello
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
hello
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
hello
#8
hello
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011

最后一行后面添加

[root@docker3 mnt]# sed '$ahello' fstab 
1
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011
hello
[root@docker3 mnt]# sed '$ahello\nyan' fstab 
1
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011
hello
yan

i参数插入 i是在最后一行前面,a是添加到最后一行

[root@docker3 mnt]# sed '$ihello\nyan' fstab 
1
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
hello
yan
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011
[root@docker3 mnt]# sed '1ihello\nyan' fstab 
hello
yan
1
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011

c参数替换

[root@docker3 mnt]# sed '/^#/chello' fstab 
1
hello
hello
hello
hello
hello
hello
hello
/dev/mapper/rhel-root   /                       xfs     defaults        0 09
UUID=cf9ffcaf-d595-4545-9fd9-3573d573976e /boot  xfs  defaults        0 010
/dev/mapper/rhel-swap   swap                    swap    defaults        0 011

w参数写入

[root@docker3 mnt]# sed '/^#/w file ' fstab 
[root@docker3 mnt]# cat file\  
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8
就是
[root@docker3 mnt]# sed -n '/^#/p' fstab > file
[root@docker3 mnt]# cat file
#2
# /etc/fstab3
# Created by anaconda on Sun Mar 28 10:44:35 2021 4
#5
# Accessible filesystems, by reference, are maintained under '/dev/disk'6
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info7
#8

r

[root@docker3 mnt]# cat yan
1
2
3
[root@docker3 mnt]# cat yan1
4
5
6
[root@docker3 mnt]# cat yan yan1
1
2
3
4
5
6
[root@docker3 mnt]# cat yan yan1 > file

倒叙

[root@docker3 mnt]# tac yan
3
2
1
[root@docker3 mnt]# tac yan yan1
3
2
1
6
5
4
[root@docker3 mnt]# tac yan1 yan
6
5
4
3
2
1

cat tac无法把文件yan1整合到数字1后面,可以正序也可以倒序
1r第一行后面

[root@docker3 mnt]# sed '1ryan1' yan
1
4
5
6
2
3

整合到某关键字后面

[root@docker3 mnt]# sed '/2/ryan1' yan
1
2
4
5
6
3

更改到原文件

[root@docker3 mnt]# sed '/2/ryan1' -i yan
[root@docker3 mnt]# cat yan
1
2
4
5
6
3

脚本
Apache_port.sh
此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
在这里插入图片描述

[root@docker3 mnt]# sh Apacha_port.sh 
Error: Please input port number following script!!!
[root@docker3 mnt]# sh Apacha_port.sh 80
Error:Apache is not installed!!

双引号不能被引用变量,单引号会注释变量,所以Listen注意是要双引号
在这里插入图片描述

[root@docker3 mnt]# sh Apacha_port.sh 8080
[root@docker3 mnt]# netstat -antlp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      4140/httpd       
[root@docker3 mnt]# sh Apacha_port.sh 80
[root@docker3 mnt]# netstat -antlp | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      4172/httpd          

sed字符替换
s是全文的行,g全文的列
部分展示 /表示分割符

[root@docker3 mnt]# sed 's/sbin/hello/g' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/hello/nologin
daemon:x:2:2:daemon:/hello:/hello/nologin
adm:x:3:4:adm:/var/adm:/hello/nologin
lp:x:4:7:lp:/var/spool/lpd:/hello/nologin
sync:x:5:0:sync:/hello:/bin/sync
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/hello/nologin
postfix:x:89:89::/var/spool/postfix:/hello/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/hello/nologin
yan:x:1000:1000::/home/yan:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/hello/nologin
[root@docker3 mnt]# sed 's/:/  /g' 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
[root@docker3 mnt]# sed 's/:/  /' 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
[root@docker3 mnt]# sed '1,5s/:/  /' 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
[root@docker3 mnt]# sed '/lp/,/halt/s/:/  /g' 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

最后一行

[root@docker3 mnt]# sed '$s/:/  /g' passwd 
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
yan:x:1000:1000::/home/yan:/bin/bash
apache  x  48  48  Apache  /usr/share/httpd  /sbin/nologin
[root@docker3 mnt]# sed '$s/:/  /g;s/sbin/hello/g'  passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/hello/nologin
daemon:x:2:2:daemon:/hello:/hello/nologin
adm:x:3:4:adm:/var/adm:/hello/nologin
lp:x:4:7:lp:/var/spool/lpd:/hello/nologin
sync:x:5:0:sync:/hello:/bin/sync
shutdown:x:6:0:shutdown:/hello:/hello/shutdown

替换/,/需要转义,因为它是分割符

[root@docker3 mnt]# sed 's/:/  /g;s/\//##/g'  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

/表示分割符,可以换成@

[root@docker3 mnt]# sed 's@:@ @g;s@/@##@g' 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

END

系列文章目录

shell三剑客之awk 2

shell三剑客之awk

  • 系列文章目录
  • 一、diff 用法 (一般作补丁,用补丁的方式更新脚本)
    • 1.1参数a添加
    • 1.2 参数c更改
    • 1.3参数d删除
    • 1.4参数a和d的对比
    • 1.5参数b(忽略空格)
    • 1.6 参数B(忽略空行)
    • 1.7 参数i(忽略大小写)
    • 1.8 参数c(显示文件所有内容并标识不同)
    • 1.9参数r(对比目录)
    • 1.10 -u参数 合并输出 (生成补丁)
  • 二、path命令
  • 三、cut用法 截取数据
  • 四、sort 排序
  • shell脚本常用基础命令1
  • 一、 uniq指令
    • 1.1参数c(对于顺序的合并重复并且统计个数)
    • 1.2uniq和sort配合使用(合并重复并统计重复个数)
    • 1.3参数d(显示重复的行)
    • 1.4参数u(显示唯一的行)
    • 1.5抓取出现数字最多的数字(不含重复出现最多数字一样)
    • 1.6抓取网卡的ip
  • 二、tr用法
  • 三、shell脚本条件
  • 四、test指令
    • 4.1test用法
    • 4.2test的条件关系
  • 五、脚本应用
    • 5.1执行脚本来判断用户的类型
    • 5.2执行脚本判断文件类型
  • shell脚本常用基础命令2
  • 一、grep用法
  • 二、sed用法
    • 2.1p参数 (显示)n参数(只显示处理过的行)
  • 系列文章目录
  • 一、awk用法
  • 二、 awk用法练习
  • 三、书写脚本通过用户文件建立用户
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本


一、awk用法

awk 用法
awk -F 分割符(没加默认是空格,不管多少个空格都算一个)BEGIN{ } 可加条件 { } END { } FILENAME(文件名称本身)

NR 行数NF 列数
¥0 所有的列¥1第一列
¥2第两列¥3第三列

“ ”双引号,表示字符串本身
没有加双引号表示字符串的变量
部分:先打印yan,在打印第五列,最后打印end
条件
/bash$/ 条件
/条件1|条件2/ 条件1或者条件2
/条件1/||/条件2/ 条件1或者条件2
/条件1/&&/条件2/ 条件1并且条件2

[root@docker3 mnt]# awk -F : 'BEGIN{print "yan"}{print $5}END{print "end"}' passwd 
yan
root
bin
daemon
halt
operator
end

显示文件有多少行

[root@docker3 mnt]# awk -F : 'BEGIN{N=0}{N++}END{print N}' passwd 
11

条件可以加多个,用;分开

[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/bash/{N++;print $7}END{print N}' passwd 
/bin/bash
/bin/bash
2
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/bash/{N++;print $7}END{print N}' passwd 
/bin/bash
/bin/bash
2
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/bash/{N++;print $0}END{print N}' passwd 
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
2

反选!

[root@docker3 mnt]# awk -F : 'BEGIN{N=0}!/bash/{N++;print $0}END{print N}' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
9

多条件

[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/bash|nologin/{N++;print $0}END{print N}' 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
ndbox the tcsd daemon:/dev/null:/sbin/nologin
yan:x:1000:1000::/home/yan:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
10
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}/^root/&&/bash$/{N++;print $0}END{print N}' passwd 
root:x:0:0:root:/root:/bin/bash
1

NR表示行数

[root@docker3 mnt]# awk -F : 'NR==1{print $0}' passwd 
root:x:0:0:root:/root:/bin/bash
[root@docker3 mnt]# awk -F : 'NR==2{print $0}' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
[root@docker3 mnt]# awk -F : '{print NR}' passwd 
1
2
3
4
5
6
7
8
9
10
11

NF表示列数

[root@docker3 mnt]# awk -F : '{print NF}' passwd 
7
7
7
7
7
7
7
7
7
7
7
[root@docker3 mnt]# awk -F : '{print FILENAME}' passwd 
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd

“ ”双引号,表示字符串本身
没有加双引号表示字符串的变量

[root@docker3 mnt]# awk -F : 'BEGIN{YAN=1}{print YAN}' passwd 
1
1
1
1
1
1
1
1
1
1
1
[root@docker3 mnt]# awk -F : 'BEGIN{YAN=1}{print "YAN"}' passwd 
YAN
YAN
YAN
YAN
YAN
YAN
YAN
YAN
YAN
YAN
YAN

~表示是

[root@docker3 mnt]# awk -F : '$7~/bash/{print $0}' passwd 
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash

!~不是

[root@docker3 mnt]# awk -F : '$7!~/bash/{print $0}' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

awk结合命令

[root@docker3 mnt]# awk '{print "date"}' passwd 
date
date
date
date
date
date
date
date
date
date
date
[root@docker3 mnt]# awk '{print "date"}' passwd | bash
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022
Sun Feb 20 05:22:11 CST 2022

二、 awk用法练习

/etc/passwd文件的第六列没有home关键字并且以bash结尾的行

[root@docker3 mnt]# awk -F : '$6!~/home/&&/bash$/{print}' passwd 
root:x:0:0:root:/root:/bin/bash

统计在系统中能用su切换的并且用户家目录不在/home下的用户数量

错的

[root@docker3 mnt]# awk -F : 'BEGIN{N=0}$7~/bash/&&$6!~/^home/{N++;print $0}END{print N}' passwd 
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
2

应该是3个,useradd -d 指定家目录

[root@docker3 mnt]# useradd -d /mnt/test -s /bin/sh yan2
[root@docker3 mnt]# su - yan2
-sh-4.2$ pwd
/mnt/test
[root@docker3 mnt]# awk -F : 'BEGIN{N=0}$7~/bash/&&$6!~/^home/{N++;print $0}END{print N}' passwd 
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
2
useradd -d /mnt/test -s /bin/sh yan2
[kiosk@foundation38 Desktop]$ awk -F : 'BEGIN{N=0}$7~/bash¥|\<sh\>¥/ &&$6!~/^home/{N++;print $0}END{print N}' passwd 
root:x:0:0:root:/root:/bin/bash
yan:x:1000:1000::/home/yan:/bin/bash
yan2:x:1002:1002::/mnt/test:/bin/sh
3

三、书写脚本通过用户文件建立用户

写个脚本
写个用户文件,启动脚本就能使得用户文件写的用户创建出来

[root@docker3 mnt]# cat userlist 
y1
w2
q3

在这里插入图片描述

[root@docker3 mnt]# sh user_create.sh /mnt
/mnt is not exist or /mnt is not file
[root@docker3 mnt]# sh user_create.sh userlist 
[root@docker3 mnt]# cat /etc/passwd 
y1:x:1003:1003::/home/y1:/bin/bash
w2:x:1004:1004::/home/w2:/bin/bash
q3:x:1005:1005::/home/q3:/bin/bash

xargs使输出通过管道变成输入的时候,成为命令的操作对象而不是参数

[root@docker3 mnt]# ls | cat
user_create.sh
userlist
[root@docker3 mnt]# ls | xargs cat
#!/bin/bash
[ -e "$*" -a -f "$*" ] ||{ echo "$*" is not exist or $* is not fileexit
}
awk '{print "useradd " $0}' $* | bash
y2
w3
q4
[root@docker3 mnt]# ls | rm -fr
[root@docker3 mnt]# ls
user_create.sh  userlist
[root@docker3 mnt]# ls | xargs rm -fr
[root@docker3 mnt]# ls
[root@docker3 mnt]# 

END

系列文章目录

shell脚本基础知识3

shell脚本基础知识3

  • 系列文章目录
  • 一、diff 用法 (一般作补丁,用补丁的方式更新脚本)
    • 1.1参数a添加
    • 1.2 参数c更改
    • 1.3参数d删除
    • 1.4参数a和d的对比
    • 1.5参数b(忽略空格)
    • 1.6 参数B(忽略空行)
    • 1.7 参数i(忽略大小写)
    • 1.8 参数c(显示文件所有内容并标识不同)
    • 1.9参数r(对比目录)
    • 1.10 -u参数 合并输出 (生成补丁)
  • 二、path命令
  • 三、cut用法 截取数据
  • 四、sort 排序
  • shell脚本常用基础命令1
  • 一、 uniq指令
    • 1.1参数c(对于顺序的合并重复并且统计个数)
    • 1.2uniq和sort配合使用(合并重复并统计重复个数)
    • 1.3参数d(显示重复的行)
    • 1.4参数u(显示唯一的行)
    • 1.5抓取出现数字最多的数字(不含重复出现最多数字一样)
    • 1.6抓取网卡的ip
  • 二、tr用法
  • 三、shell脚本条件
  • 四、test指令
    • 4.1test用法
    • 4.2test的条件关系
  • 五、脚本应用
    • 5.1执行脚本来判断用户的类型
    • 5.2执行脚本判断文件类型
  • shell脚本常用基础命令2
  • 一、grep用法
  • 二、sed用法
    • 2.1p参数 (显示)n参数(只显示处理过的行)
  • 系列文章目录
  • 一、awk用法
  • 二、 awk用法练习
  • 三、书写脚本通过用户文件建立用户
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本


一、什么是shell

脚本中命令的解释器
c描述性语言—开发工具 c->os code 需要编译
shell python解释型语言
在这里插入图片描述


二、shell脚本意义

a.记录命令执行的过程和执行逻辑,以便以后重复执行
b.脚本可以批量处理主机
c.脚本可以定时处理主机


三、如何创建shell脚本(幻数)

#!/bin/bash 幻数(不变的量,代码优先执行的程序)类似脚本运行的依赖性

/mnt/test.sh ctrl+z打入后台,执行脚本的时候运行了幻数

[root@docker3 mnt]# cat test.sh 
#!/bin/bash
cat
[root@docker3 mnt]# chmod +x test.sh 
[root@docker3 mnt]# /mnt/test.sh 
^Z
[1]+  Stopped                 /mnt/test.sh
[root@docker3 mnt]# ps f PID TTY      STAT   TIME COMMAND3482 pts/0    Ss     0:00 -bash4572 pts/0    T      0:00  \_ /bin/bash /mnt/test.sh4573 pts/0    T      0:00  |   \_ cat4579 pts/0    R+     0:00  \_ ps f3021 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

更改幻数
bash变成sh了

[root@docker3 mnt]# cat test.sh 
#!/bin/sh
cat
[root@docker3 mnt]# /mnt/test.sh 
^Z
[2]+  Stopped                 /mnt/test.sh
[root@docker3 mnt]# ps f PID TTY      STAT   TIME COMMAND3482 pts/0    Ss     0:00 -bash4572 pts/0    T      0:00  \_ /bin/bash /mnt/test.sh4573 pts/0    T      0:00  |   \_ cat4589 pts/0    T      0:00  \_ /bin/sh /mnt/test.sh4590 pts/0    T      0:00  |   \_ cat4591 pts/0    R+     0:00  \_ ps f3021 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

可以跟你想要的环境,vim不行,vim是交互式

[root@docker3 mnt]# cat test.sh 
#!/bin/cat
afsdf
afsaf
af
[root@docker3 mnt]# /mnt/test.sh 
#!/bin/cat
afsdf
afsaf
af

四、自动生成脚本头信息

每次写脚本添加这些信息很麻烦
在这里插入图片描述
所以可以配置vim的生成模板
修改这个文件后,任何人使用vim,都会生成模板

[root@docker3 mnt]# vim /etc/vimrc 

所以编写自己用户的vim的配置文件
ts是一个tab长度,sw缩进的长度,ai自动缩进,et把tab键自动转化成空格,不加et,tab一次2个空格是一个整体,加上后,tab一次是一个空格,一共两个空格

[root@docker3 mnt]# vim ~/.vimrc

按键添加,append(0)是第一行

setloacl ts=2 sw=2 ai et
map <F9> ms:call SHELLTITLE()<cr>'s
"autocmd BufNewFile *.sh call SHELLTITLE()"
func SHELLTITLE()call append(0,"#########################################")
endfunc

自动挂载,新文件sh结尾的文件

setloacl ts=2 sw=2 ai et
"map <F9> ms:call SHELLTITLE()<cr>'s
autocmd BufNewFile *.sh call SHELLTITLE()"
func SHELLTITLE()call append(0,"#########################################")
endfunc

自动添加上去了

[root@docker3 mnt]# vim test3.sh
#########################################

.表示这段结束,下一段
strftime采集时间的函数%Y年%m月%d天

setloacl ts=2 sw=2 ai et
autocmd BufNewFile *.sh call SHELLTITLE()"
func SHELLTITLE()call append(0,"#########################################")call append(1,"# Create_Time".strftime("%Y%m%d"))
endfunc

五、shell脚本运行方式

5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数

[root@docker3 mnt]# vim test.sh
[root@docker3 mnt]# sh test.sh 
^Z
[1]+  Stopped                 sh test.sh
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3577 pts/0    T      0:00  \_ sh test.sh3578 pts/0    T      0:00  |   \_ cat3579 pts/0    R+     0:00  \_ ps f3006 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash

[root@docker3 mnt]# . test2.sh.sh 
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3627 pts/0    T      0:00  \_ cat3628 pts/0    R+     0:00  \_ ps f3622 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

.空格加脚本=source 脚本

[root@docker3 mnt]# fg
cat
^C
[root@docker3 mnt]# source test2.sh 
^Z
[1]+  Stopped                 cat
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3631 pts/0    T      0:00  \_ cat3632 pts/0    R+     0:00  \_ ps f3622 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

加入可执行权限后,脚本会调用幻数执行


5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令

./脚本代表当前环境下开启或者绝对路径方式调用,必须加执行权限

[root@docker3 mnt]# ls -l test2.sh 
-rw-r--r-- 1 root root 14 Feb 20 21:46 test2.sh
[root@docker3 mnt]# chmod +x test2.sh 
[root@docker3 mnt]# ls -l test2.sh 
-rwxr-xr-x 1 root root 14 Feb 20 21:46 test2.sh
[root@docker3 mnt]# ./test2.sh 
^Z
[1]+  Stopped                 ./test2.sh
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3642 pts/0    T      0:00  \_ /bin/sh ./test2.sh3643 pts/0    T      0:00  |   \_ cat3645 pts/0    R+     0:00  \_ ps f3622 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

相当于绝对路径方式

[root@docker3 mnt]# /mnt/test2.sh 
^Z
[1]+  Stopped                 /mnt/test2.sh
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3648 pts/0    T      0:00  \_ /bin/sh /mnt/test2.sh3649 pts/0    T      0:00  |   \_ cat3650 pts/0    R+     0:00  \_ ps f3622 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

六、对脚本的调试

脚本卡死,不动

[root@docker3 mnt]# cat test.sh 
#!/bin/sh
date
cal
cat
ls /mnt
[root@docker3 mnt]# sh test.sh 
Sun Feb 20 21:59:09 CST 2022February 2022   
Su Mo Tu We Th Fr Sa1  2  3  4  56  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28

sh -x 对脚本执行的检测,带+表示执行的动作,不带加号代表执行的输出,可以看出问题点在cat

[root@docker3 mnt]# sh -x test.sh 
+ date
Sun Feb 20 22:00:36 CST 2022
+ calFebruary 2022   
Su Mo Tu We Th Fr Sa1  2  3  4  56  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28+ cat

七、书写清空日志脚本

脚本:
clear_log.sh 执行脚本后可以清空日志
里面RULES告诉了日志的采集点,所以我们要过滤RULES底下的行

[kiosk@foundation38 Desktop]$ cat /etc/rsyslog.conf 
[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf 

这个写法

[root@docker3 mnt]# sed '/^#/d' /etc/rsyslog.conf | sed '/^$/d;/^\$/d;s/-/ /g;/:omusrmsg:/d' |  awk {'print $2'}  

或者这样写

[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf | sed 's/-//g;/^$/d;/^#/d;/:omusrmsg:/d'| awk '{print $2}'
/var/log/messages
/var/log/secure
/var/log/maillog
/var/log/cron
/var/log/spooler
/var/log/boot.log

清空

[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf | sed 's/-//g;/^$/d;/^#/d;/:omusrmsg:/d'| awk '{print ">" $2}' 
>/var/log/messages
>/var/log/secure
>/var/log/maillog
>/var/log/cron
>/var/log/spooler
>/var/log/boot.log
[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf | sed 's/-//g;/^$/d;/^#/d;/:omusrmsg:/d'| awk '{print ">" $2}' | bash
[root@docker3 mnt]# cat /var/log/messages
[root@docker3 mnt]# systemctl restart sshd
[root@docker3 mnt]# cat /var/log/messages
Feb 20 22:42:59 docker3 systemd: Stopping OpenSSH server daemon...
Feb 20 22:42:59 docker3 systemd: Stopped OpenSSH server daemon.
Feb 20 22:42:59 docker3 systemd: Starting OpenSSH server daemon...
Feb 20 22:42:59 docker3 systemd: Started OpenSSH server daemon.
[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf | sed 's/-//g;/^$/d;/^#/d;/:omusrmsg:/d'| awk '{print ">" $2}' | bash
[root@docker3 mnt]# cat /var/log/messages

END

系列文章目录

shell脚本基础知识3

shell脚本基础知识3

  • 系列文章目录
  • 一、diff 用法 (一般作补丁,用补丁的方式更新脚本)
    • 1.1参数a添加
    • 1.2 参数c更改
    • 1.3参数d删除
    • 1.4参数a和d的对比
    • 1.5参数b(忽略空格)
    • 1.6 参数B(忽略空行)
    • 1.7 参数i(忽略大小写)
    • 1.8 参数c(显示文件所有内容并标识不同)
    • 1.9参数r(对比目录)
    • 1.10 -u参数 合并输出 (生成补丁)
  • 二、path命令
  • 三、cut用法 截取数据
  • 四、sort 排序
  • shell脚本常用基础命令1
  • 一、 uniq指令
    • 1.1参数c(对于顺序的合并重复并且统计个数)
    • 1.2uniq和sort配合使用(合并重复并统计重复个数)
    • 1.3参数d(显示重复的行)
    • 1.4参数u(显示唯一的行)
    • 1.5抓取出现数字最多的数字(不含重复出现最多数字一样)
    • 1.6抓取网卡的ip
  • 二、tr用法
  • 三、shell脚本条件
  • 四、test指令
    • 4.1test用法
    • 4.2test的条件关系
  • 五、脚本应用
    • 5.1执行脚本来判断用户的类型
    • 5.2执行脚本判断文件类型
  • shell脚本常用基础命令2
  • 一、grep用法
  • 二、sed用法
    • 2.1p参数 (显示)n参数(只显示处理过的行)
  • 系列文章目录
  • 一、awk用法
  • 二、 awk用法练习
  • 三、书写脚本通过用户文件建立用户
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本
  • 系列文章目录
  • 一、什么是shell
  • 二、shell脚本意义
  • 三、如何创建shell脚本(幻数)
  • 四、自动生成脚本头信息
  • 五、shell脚本运行方式
    • 5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数
    • 5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash
    • 5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令
  • 六、对脚本的调试
  • 七、书写清空日志脚本


一、什么是shell

脚本中命令的解释器
c描述性语言—开发工具 c->os code 需要编译
shell python解释型语言
在这里插入图片描述


二、shell脚本意义

a.记录命令执行的过程和执行逻辑,以便以后重复执行
b.脚本可以批量处理主机
c.脚本可以定时处理主机


三、如何创建shell脚本(幻数)

#!/bin/bash 幻数(不变的量,代码优先执行的程序)类似脚本运行的依赖性

/mnt/test.sh ctrl+z打入后台,执行脚本的时候运行了幻数

[root@docker3 mnt]# cat test.sh 
#!/bin/bash
cat
[root@docker3 mnt]# chmod +x test.sh 
[root@docker3 mnt]# /mnt/test.sh 
^Z
[1]+  Stopped                 /mnt/test.sh
[root@docker3 mnt]# ps f PID TTY      STAT   TIME COMMAND3482 pts/0    Ss     0:00 -bash4572 pts/0    T      0:00  \_ /bin/bash /mnt/test.sh4573 pts/0    T      0:00  |   \_ cat4579 pts/0    R+     0:00  \_ ps f3021 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

更改幻数
bash变成sh了

[root@docker3 mnt]# cat test.sh 
#!/bin/sh
cat
[root@docker3 mnt]# /mnt/test.sh 
^Z
[2]+  Stopped                 /mnt/test.sh
[root@docker3 mnt]# ps f PID TTY      STAT   TIME COMMAND3482 pts/0    Ss     0:00 -bash4572 pts/0    T      0:00  \_ /bin/bash /mnt/test.sh4573 pts/0    T      0:00  |   \_ cat4589 pts/0    T      0:00  \_ /bin/sh /mnt/test.sh4590 pts/0    T      0:00  |   \_ cat4591 pts/0    R+     0:00  \_ ps f3021 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

可以跟你想要的环境,vim不行,vim是交互式

[root@docker3 mnt]# cat test.sh 
#!/bin/cat
afsdf
afsaf
af
[root@docker3 mnt]# /mnt/test.sh 
#!/bin/cat
afsdf
afsaf
af

四、自动生成脚本头信息

每次写脚本添加这些信息很麻烦
在这里插入图片描述
所以可以配置vim的生成模板
修改这个文件后,任何人使用vim,都会生成模板

[root@docker3 mnt]# vim /etc/vimrc 

所以编写自己用户的vim的配置文件
ts是一个tab长度,sw缩进的长度,ai自动缩进,et把tab键自动转化成空格,不加et,tab一次2个空格是一个整体,加上后,tab一次是一个空格,一共两个空格

[root@docker3 mnt]# vim ~/.vimrc

按键添加,append(0)是第一行

setloacl ts=2 sw=2 ai et
map <F9> ms:call SHELLTITLE()<cr>'s
"autocmd BufNewFile *.sh call SHELLTITLE()"
func SHELLTITLE()call append(0,"#########################################")
endfunc

自动挂载,新文件sh结尾的文件

setloacl ts=2 sw=2 ai et
"map <F9> ms:call SHELLTITLE()<cr>'s
autocmd BufNewFile *.sh call SHELLTITLE()"
func SHELLTITLE()call append(0,"#########################################")
endfunc

自动添加上去了

[root@docker3 mnt]# vim test3.sh
#########################################

.表示这段结束,下一段
strftime采集时间的函数%Y年%m月%d天

setloacl ts=2 sw=2 ai et
autocmd BufNewFile *.sh call SHELLTITLE()"
func SHELLTITLE()call append(0,"#########################################")call append(1,"# Create_Time".strftime("%Y%m%d"))
endfunc

五、shell脚本运行方式

5.1手动在环境中开启指定解释器,不会开启脚本指定的幻数

[root@docker3 mnt]# vim test.sh
[root@docker3 mnt]# sh test.sh 
^Z
[1]+  Stopped                 sh test.sh
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3577 pts/0    T      0:00  \_ sh test.sh3578 pts/0    T      0:00  |   \_ cat3579 pts/0    R+     0:00  \_ ps f3006 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

5.2不会开启一个新的sh,在当前环境运行sh,当前环境bash

[root@docker3 mnt]# . test2.sh.sh 
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3627 pts/0    T      0:00  \_ cat3628 pts/0    R+     0:00  \_ ps f3622 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

.空格加脚本=source 脚本

[root@docker3 mnt]# fg
cat
^C
[root@docker3 mnt]# source test2.sh 
^Z
[1]+  Stopped                 cat
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3631 pts/0    T      0:00  \_ cat3632 pts/0    R+     0:00  \_ ps f3622 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

加入可执行权限后,脚本会调用幻数执行


5.3开启脚本中指定的shell并使用此shell环境运行脚本的指令

./脚本代表当前环境下开启或者绝对路径方式调用,必须加执行权限

[root@docker3 mnt]# ls -l test2.sh 
-rw-r--r-- 1 root root 14 Feb 20 21:46 test2.sh
[root@docker3 mnt]# chmod +x test2.sh 
[root@docker3 mnt]# ls -l test2.sh 
-rwxr-xr-x 1 root root 14 Feb 20 21:46 test2.sh
[root@docker3 mnt]# ./test2.sh 
^Z
[1]+  Stopped                 ./test2.sh
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3642 pts/0    T      0:00  \_ /bin/sh ./test2.sh3643 pts/0    T      0:00  |   \_ cat3645 pts/0    R+     0:00  \_ ps f3622 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

相当于绝对路径方式

[root@docker3 mnt]# /mnt/test2.sh 
^Z
[1]+  Stopped                 /mnt/test2.sh
[root@docker3 mnt]# ps fPID TTY      STAT   TIME COMMAND3486 pts/0    Ss     0:00 -bash3648 pts/0    T      0:00  \_ /bin/sh /mnt/test2.sh3649 pts/0    T      0:00  |   \_ cat3650 pts/0    R+     0:00  \_ ps f3622 tty1     Ss+    0:00 /sbin/agetty --noclear tty1 linux

六、对脚本的调试

脚本卡死,不动

[root@docker3 mnt]# cat test.sh 
#!/bin/sh
date
cal
cat
ls /mnt
[root@docker3 mnt]# sh test.sh 
Sun Feb 20 21:59:09 CST 2022February 2022   
Su Mo Tu We Th Fr Sa1  2  3  4  56  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28

sh -x 对脚本执行的检测,带+表示执行的动作,不带加号代表执行的输出,可以看出问题点在cat

[root@docker3 mnt]# sh -x test.sh 
+ date
Sun Feb 20 22:00:36 CST 2022
+ calFebruary 2022   
Su Mo Tu We Th Fr Sa1  2  3  4  56  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28+ cat

七、书写清空日志脚本

脚本:
clear_log.sh 执行脚本后可以清空日志
里面RULES告诉了日志的采集点,所以我们要过滤RULES底下的行

[kiosk@foundation38 Desktop]$ cat /etc/rsyslog.conf 
[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf 

这个写法

[root@docker3 mnt]# sed '/^#/d' /etc/rsyslog.conf | sed '/^$/d;/^\$/d;s/-/ /g;/:omusrmsg:/d' |  awk {'print $2'}  

或者这样写

[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf | sed 's/-//g;/^$/d;/^#/d;/:omusrmsg:/d'| awk '{print $2}'
/var/log/messages
/var/log/secure
/var/log/maillog
/var/log/cron
/var/log/spooler
/var/log/boot.log

清空

[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf | sed 's/-//g;/^$/d;/^#/d;/:omusrmsg:/d'| awk '{print ">" $2}' 
>/var/log/messages
>/var/log/secure
>/var/log/maillog
>/var/log/cron
>/var/log/spooler
>/var/log/boot.log
[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf | sed 's/-//g;/^$/d;/^#/d;/:omusrmsg:/d'| awk '{print ">" $2}' | bash
[root@docker3 mnt]# cat /var/log/messages
[root@docker3 mnt]# systemctl restart sshd
[root@docker3 mnt]# cat /var/log/messages
Feb 20 22:42:59 docker3 systemd: Stopping OpenSSH server daemon...
Feb 20 22:42:59 docker3 systemd: Stopped OpenSSH server daemon.
Feb 20 22:42:59 docker3 systemd: Starting OpenSSH server daemon...
Feb 20 22:42:59 docker3 systemd: Started OpenSSH server daemon.
[root@docker3 mnt]# grep -A $(sed -n '$=' /etc/rsyslog.conf) RULES /etc/rsyslog.conf | sed 's/-//g;/^$/d;/^#/d;/:omusrmsg:/d'| awk '{print ">" $2}' | bash
[root@docker3 mnt]# cat /var/log/messages

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造创新的金融数据平台,加速数字化和智能化转型丨PingCAP 官网金融行业专区上线

自诞生以来&#xff0c;TiDB 的原生分布式架构在强一致性、高可用性和可扩展性等方面与金融级业务需求高度契合&#xff0c;早期版本即为包括北京银行在内的金融用户提供服务。 TiDB 的核心能力始终源自与中国金融用户的共同创造。作为金融级分布式数据库&#xff0c;TiDB 在国…

【pytorch】使用pytorch构建线性回归模型-了解计算图和自动梯度

使用pytorch构建线性回归模型 线性方程的一般形式 衡量线性损失的一般形式-均方误差 pytorch中计算图的作用和优势 在 PyTorch 中&#xff0c;计算图&#xff08;Computational Graph&#xff09;是一种用于表示神经网络运算的数据结构。每个节点代表一个操作&#xff0c;例如…

药物“出气”可知|ZL-005大小鼠雾化给药仪

雾化吸入给药是一种通过装置使药物进入肺部局部或全身发挥作用的给药方式。相较于口服药剂&#xff0c;雾化吸入给药可避免首过效应和药剂破坏&#xff0c;提高药物生物利用度。 而ZL-005大小鼠雾化给药仪&#xff0c;则是新一代小动物雾化装置的理想选择&#xff0c;可完成动…

JavaWeb之Redis

31、Redis 31.1、Redis概述 概念&#xff1a;redis是一款高性能的NOSQL系列的非关系性数据库 什么是NOSQL NoSQL(NoSQL Not Only SQL)&#xff0c;意即“不仅仅是SQL”&#xff0c;是一项全新的数据库理念&#xff0c;泛指非关系型的数据库。 随着互联网web2.0网站的兴起&a…

MIT_线性代数笔记:第 26 讲 复矩阵;快速傅里叶变换

目录 复向量 Complex vectors复矩阵 Complex matrices傅里叶变换 Fourier transform快速傅里叶变换 Fast Fourier transform 实矩阵也可能有复特征值&#xff0c;因此无法避免在矩阵运算中碰到复数&#xff0c;本讲学习处理复数矩阵和复向量。 最重要的复矩阵是傅里叶矩阵&…

电力能源监测管理系统,在医院中有哪些作用?

随着经济全球化的发展&#xff0c;节能减排成为当前社会发展必须关注的问题。电力能源监测管理系统&#xff0c;可以分析电力管理能源的现状&#xff0c;并根据现状提出对应的策略&#xff0c;为快速高效建成绿色智能化医院提供有力支撑和技术保障。 医院能源管理现状 1、人力…

Java零基础教学文档第四篇:HTML_CSS_JavaScript(2)

【HTML】 【主要内容】WEB: 1&#xff0e;Web前端简介 2&#xff0e;创建第一个前端项目 3&#xff0e;相关标签详解 4&#xff0e;表格标签详解 5&#xff0e;表单标签详解 6&#xff0e;框架和实体字符 【学习目标】 1. Web前端简介 1.1 为什么要学习Web前端&#…

Windows10 Docker Desktop安装

一、简介 Docker Desktop是Docker公司推出的一款桌面应用程序&#xff0c;它提供了一个用户友好的界面&#xff0c;方便开发人员在本地环境中使用容器技术。 容器是一种轻量级的虚拟化技术&#xff0c;可以将应用程序和其依赖项打包在一起&#xff0c;形成一个独立、可移植的…

Linux学习之网络编程1(纯理论)

写在前面 刚刚更新完Linux系统编程&#xff0c;特别推荐大家去看的Linux系统编程&#xff0c;总共44个小时&#xff0c;老师讲的非常好&#xff0c;我是十天肝完的&#xff0c;每天大概看20集&#xff0c;每天还要以写blog的形式来写笔记来总结一下&#xff0c;虽然这十天有点…

适用于Mac电脑的 iOS 设备管理器选 iTunes 还是iMazing?

mac上有没有好用的ios设备管理器&#xff1f; 因为工作的关系&#xff0c;一共使用3部苹果手机&#xff0c;资料很杂很多也很乱&#xff0c;想整理也不知道从何下手&#xff0c;有人推荐【iTunes】&#xff0c;有人推荐【iMazing】&#xff0c;该如何选择呢&#xff1f; 一、i…

架构师 - 架构师是做什么的 - 学习总结

架构师核心定义 架构师是什么 架构师是业务和技术之间的桥梁 架构师的核心职责是消除不确定性、和降低复杂性 架构设计环 架构师的三个核心能力 架构师的三个关键思维 架构师主要职责 架构设计 Vs 方案设计 架构设计前期 主要任务 澄清不确定性 明确利益干系人的诉求消除冲…

2024.1.13力扣每日一题——构造限制重复的字符串

2024.1.13 题目来源我的题解方法一 计数模拟 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2182 我的题解 方法一 计数模拟 因为字符串s由小写字母构成&#xff0c;因此使用一个int[26]的数组保存每个字符的数量&#xff0c;然后从最大的字符开始构造结果字符串sb&…

段码液晶显示屏模块 背光控制的坑

玩的这个模块做测试&#xff0c;它的引脚有以下的介绍&#xff0c;商家提供了些资料&#xff0c;但没原理图。 led引脚想当然的接个IO输出口&#xff0c;但怎么输出0或1都不能控制背光 然后仔细研究了上面的电路&#xff0c;才发现LED是直接连接着VCC的 总结是这个背光要控制的…

曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 贝塞尔曲线的应用2 图解贝塞尔曲线3 贝塞尔曲线的性质4 算法仿真4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法…

全包了 功能超级强大的linux管理平台1panel部署教程

目录 先看下效果 1.1panel是什么 2.安装教程 2.1下载安装包 2.2解压 2.3安装 3.查看 3.1初始化并登录 3.2容器管理页面&#xff0c;可以启动 重启 创建容器 ​编辑 3.3应用商店 意见安装常用应用 ​编辑 3.4可视化任务管理 3.5网站管理 3.6数据库管理 ​编辑 3…

iOS UIViewContentMode 不同效果图文对比

一. iOS提供了的ContentMode有如下几种 其中默认mode是UIViewContentModeScaleToFill typedef NS_ENUM(NSInteger, UIViewContentMode) {UIViewContentModeScaleToFill,UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is tr…

Python教程44:海龟画图turtle画卡塔尔世界杯吉祥物

---------------turtle源码集合--------------- Python教程42&#xff1a;海龟画图turtle画海绵宝宝 Python教程41&#xff1a;海龟画图turtle画蜡笔小新 Python教程40&#xff1a;使用turtle画一只杰瑞 Python教程39&#xff1a;使用turtle画美国队长盾牌 Python教程38&a…

领域驱动设计解决汉诺塔问题-文风批评(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 以下文章内容纯属虚构&#xff0c;用来批评某些领域驱动设计文风。后续将挑一些近期的文章作为例子来批评。 ********** 领域驱动设计是革命性的创新&#xff0c;是划时代的洞见。领…

OpenCV-Python(40):光流算法

目标 光流的概念以及Lucas-Kanade 光流法使用函数cv2.calcOpticalFlowPyrLK() 对图像中的特征点进行跟踪 光流 介绍 由于目标对象或者摄像机的移动造成的图像对象在连续两帧图像中的移动被称为光流。它是一个2D 向量场&#xff0c;可以用来显示一个点从第一帧图像到第二帧图像…

CLion、IDEA设置编码为utf-8,防乱码

其实只要是JetBrains的软件都是通用的&#xff0c;下面以IDEA为例 1.设置项目文件编码 2.设置控制台的字符编码