week_3_bash脚本配置与grep、find使用
Q:
1、定义一个对所有用户都生效的命令别名,例如:lftps='lftp 172.168.0.1/pub'
2、显示/etc/passwd文件中不以/bin/bash结尾的行
3、找出/etc/passwd文件中,包含二位数字或者三位数的行。
4、显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式实现。
5、使用echo输出一个绝对路径,使用egrep取出路径名,类似执行dirname /etc/passwd 的结果。
6、找出ifconfig中的ip地址。要求结果只显示IP地址。
7、vim定制自动缩进四个字符。
8、编写脚本,实现自动添加三个用户,并计算这三个用户的uid之和。
9、find用法以及常用用法的实例演示。
A:
1、
[root@localhost ~]# cp /etc/profile ./profile.bak
[root@localhost ~]# echo 'alias lftps="lftp 172.168.0.1/pub"' >> /etc/profile
[root@localhost ~]# diff /etc/profile profile.bak
77d76
< alias lftps="lftp 172.168.0.1/pub"
[root@localhost ~]# . /etc/profile
[root@localhost ~]# alias -p | grep lftps
alias lftps='lftp 172.168.0.1/pub'
用patch恢复profile
[root@localhost ~]# diff -u /etc/profile profile.bak >profile.patch
[root@localhost ~]# patch /etc/profile < profile.patch
patching file /etc/profile
2、grep -v '/bin/bash$' /etc/passwd
[root@localhost ~]# grep -v '/bin/bash$' /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
...
testgrep:x:4006:4006::/home/testgrep:/bin/bashhh
nologin:x:4012:4012::/home/nologin:/sbin/nologin
3、grep '<[[:digit:]]{2,3}>' /etc/passwd
[root@localhost ~]# grep '\<[[:digit:]]\{2,3\}\>' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
...
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mariadb:x:997:995::/home/mariadb:/sbin/nologin
4、
[root@localhost ~]# grep -i '^s' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 7596 kB
Slab: 60660 kB
SReclaimable: 23600 kB
SUnreclaim: 37060 kB
[root@localhost ~]# grep '^[sS]' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 7596 kB
Slab: 60660 kB
SReclaimable: 23600 kB
SUnreclaim: 37060 kB
[root@localhost ~]# grep -E '^(s|S)' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 7596 kB
Slab: 60660 kB
SReclaimable: 23600 kB
SUnreclaim: 37060 kB
5、
[root@localhost ~]# echo '/etc/rc.d/init.d/functions' |egrep -o '(/[^/]*){3}'
/etc/rc.d/init.d
6、
[root@localhost ~]# ifconfig | egrep -o '((2[0-4][0-9]|25[0-5]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(2[0-4][0-9]|25[0-5]|1[0-9]{2}|[1-9][0-9]|[0-9])'
192.168.223.129
255.255.255.0
192.168.223.255
127.0.0.1
255.0.0.0
7、
:set tabstop=4
8、
[root@localhost ~]# bash mytest.sh
uid=4017(shtest3) gid=4017(shtest3) groups=4017(shtest3)
uid=4018(shtest2) gid=4018(shtest2) groups=4018(shtest2)
uid=4019(shtest1) gid=4019(shtest1) groups=4019(shtest1)
12054
[root@localhost ~]# cat mytest.sh
#/bin/bash
user1='shtest1' && user2='shtest2' && user3='shtest3'
id $user3 || useradd -p $user3 $user3
id $user2 || useradd -p $user2 $user2
id $user1 || useradd -p $user1 $user1
uid1=`grep "$user1" /etc/passwd |cut -d: -f3`
uid2=`grep "$user2" /etc/passwd |cut -d: -f3`
uid3=`grep "$user3" /etc/passwd |cut -d: -f3`
let result=uid1+uid2+uid3
echo $result
9、find使用方法以及示例
https://www.jianshu.com/p/efea5e3489f5
所参考的知识点如下
- bash环境配置
- grep以及正则表达式
- vim配置
- bash脚本算术运算
- find文件查找处理工具
bash的配置文件:
两类:
profile类:为交互式登录的shell进程提供配置
bashrc类:为非交互式登录的shell进程提供配置
登录类型:
交互式登录shell进程:
直接通过某终端输入账号和密码后登录打开的shell进程;
使用su命令:su - USERNAME, 或者使用 su -l USERNAME执行的登录切换;
非交互式登录shell进程:
su USERNAME执行的登录切换;
图形界面下打开的终端;
运行脚本
profile类:
全局有效 | 用户有效 |
---|---|
/etc/profile /etc/profile.d/*.sh
|
~/.bash_profile |
功用:
1、用于定义环境变量;
2、运行命令或脚本;
bashrc类:
全局有效 | 用户有效 |
---|---|
/etc/bashrc |
~/.bashrc |
功用:
1、定义本地变量;
2、定义命令别名;
注意:仅管理员可修改全局配置文件
环境变量读取顺序
交互式登录shell进程:
/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录shell进程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*
命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期;
配置文件定义的特性,只对随后新启动的shell进程有效;
让通过配置文件定义的特性立即生效:
- 通过命令行重复定义一次;
- 让shell进程重读配置文件;
~]# source /PATH/FROM/CONF_FILE
or
~]# . /PATH/FROM/CONF_FILE
diff:compare files line by line
diff [OPTION]... FILES
diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
-u:使用unified机制,即显示要修改的行的上下文,默认为3行;
patch:向文件打补丁
patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE
- R :反向打补丁
grep
Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPTION:
--color=auto:对匹配到的文本着色后高亮显示;
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v, --invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q, --quiet, --silent:静默模式,即不输出任何信息;
-A #:after, 后#行
-B #:before,前#行
-C #:context,前后各#行
基本正则表达式
字符匹配:
. :匹配任意单个字符
[] :匹配指定范围内单个字符
upper lower alpha digit space alnum punct
[^]:匹配范围外的单个字符
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
* :匹配其前面的字符任意次;0,1,多次;
.*:匹配任意长度的任意字符
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
\+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
位置锚定:
^:行首锚定;用于模式的最左侧;
$:行尾锚定;用于模式的最右侧;
^PATTERN$:用于PATTERN来匹配整行;
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\< 或 \b:词首锚定,用于单词模式的左侧;
\> 或 \b:词尾锚定,用于单词模式的右侧;
\<PATTERN\>:匹配完整单词;
扩展的正则表达式
分组及引用:
():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;
后向引用:\1, \2, ...
或
a|b:a或者b;
C|cat:C或cat
(c|C)at:cat或Cat
定制vim的特性
注意:在末行模式下的设定,仅对当前vim进程有效
永久有效:
全局:/etc/vimrc
用户个人:~/.vimrc
行号
显示:set number, 简写为set nu
取消显示:set nonumber, set nonu
//括号匹配高亮 这功能已炸
匹配:set showmatch, set sm
取消:set noshowmatch,set nosm
自动缩进
启用:set ai
禁用:set noai
高亮搜索
启用:set hlsearch
禁用:set nohlsearch
语法高亮
启用:syntax on
禁用:syntax off
忽略字符大小写
启用:set ic
禁用:set noic
获取帮助:
:help
:help subject
bash脚本编程之算术运算
+,-,*,/, **, %
算术运算格式:
- let VAR=EXPRESSION
- VAR=$[EXPRESSION]
- VAR=$((EXPRESSION))
- VAR=$(expr $ARG1 $OP $ARG2)
man expr
注意:乘法符号在有些场景中需要使用转义符;
find
实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找;
工作特性:
查找速度略慢;
精确查找;
实时查找
NAME
find - search for files in a directory hierarchy
SYNOPSIS
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
用法:
find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;
处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;
查找条件:
表达式:选项和测试
测试:结果通常为布尔型("true", "false")
根据文件名查找:
-name "pattern"
-iname "pattern"
支持glob风格的通配符;
*, ?, [], [^]
-regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非其名;
根据文件从属关系查找:
-user USERNAME:查找属主指定用户的所有文件;
-group GRPNAME:查找属组指定组的所有文件;
-uid UID:查找属主指定的UID的所有文件;
-gid GID:查找属组指定的GID的所有文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
根据文件的类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l:符号链接文件
b:块设备 文件
c:字符设备文件
p:管道文件
s:套接字文件
组合测试:
与:-a, 默认组合逻辑;
或:-o
非:-not, !
练习
1、找出/tmp目录下属主为非root的所有文件;
[root@localhost ~]# find /etc -not -user root -ls
33874928 0 drwx------ 2 polkitd root 65 Jan 8 12:36 /etc/polkit-1/rules.d
2、找出/tmp目录下文件名中不包含fstab字符串的文件;
[root@localhost ~]# find /tmp -not -name '*fstab*'
/tmp
/tmp/.XIM-unix
/tmp/.Test-unix
/tmp/.X11-unix
/tmp/.font-unix
/tmp/.ICE-unix
/tmp/whoknow
3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;
[root@localhost ~]# find /tmp -not -name '*fstab*' -o -user root -ls
67163701 4 -rw-r--r-- 1 root root 657 Feb 1 02:02 /tmp/fstab.test
第三题提示
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
根据文件的大小查找:
-size [+|-]#UNIT
常用单位:k, M, G
#UNIT:(#-1, #]
-#UNIT:[0,#-1]
+#UNIT:(#, ∞)
根据时间戳查找:
以“天”为单位:
-atime [+|-]#
#:[#, #-1)
-#:(#, 0]
+#:(∞, #-1]
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
根据权限查找:
-perm [/|-]mode
mode:精确权限匹配;
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;
9位权限之间存在“或”关系;
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;
9位权限之间存在“与”关系;
处理动作:
-print:输出至标准输出;默认的动作;
-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
-delete:删除查找到的文件;
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
-exec COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;
注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:
find | xargs COMMAND
课外作业:学习xargs命令的用法;
练习
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
[root@localhost ~]# find /var -user root -group mail -ls
100768978 0 drwxrwxr-x 2 root mail 167 Feb 1 05:31 /var/spool/mail
2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;
[root@localhost ~]# find /usr -not -user root -o -not -user bin -o -not -user hadoop -ls
[root@localhost ~]# find /usr -not -user root -a -user bin -a -user hadoop -ls
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;
[root@localhost ~]# find /etc -mtime 7 -a -not -user root -a -not -user hadoop
4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录;
[root@localhost ~]# find / -nouser -o -nogroup -a -atime 7
/home/gentoo
/home/gentoo/.bash_logout
/home/gentoo/.bash_profile
/home/gentoo/.bashrc
find: ‘/proc/6930/task/6930/fd/6’: No such file or directory
find: ‘/proc/6930/task/6930/fdinfo/6’: No such file or directory
find: ‘/proc/6930/fd/5’: No such file or directory
find: ‘/proc/6930/fdinfo/5’: No such file or directory
5、查找/etc目录下大于1M且类型为普通文件的所有文件;
[root@localhost ~]# find /etc -size +1M -a -type f
/etc/udev/hwdb.bin
/etc/selinux/targeted/active/policy.kern
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/selinux/targeted/policy/policy.31
6、查找/etc目录下所有用户都没有写权限的文件;
[root@localhost ~]# find /etc -not -perm /222 -ls
33595586 252 -r--r--r-- 1 root root 257889 Jan 8 12:36 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
67202654 208 -r--r--r-- 1 root root 211658 Jan 8 12:36 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
67202655 176 -r--r--r-- 1 root root 177221 Jan 8 12:36 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
67202656 0 -r--r--r-- 1 root root 0 Jan 8 12:36 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
34053892 4 -r--r--r-- 1 root root 63 Nov 8 18:43 /etc/ld.so.conf.d/kernel-3.10.0-957.el7.x86_64.conf
67268168 4 -r-------- 1 root root 45 Jan 8 12:36 /etc/openldap/certs/password
67510732 8 -r--r----- 1 root root 4328 Oct 30 10:38 /etc/sudoers
7、查找/etc目录至少有一类用户没有执行权限的文件;
[root@localhost ~]# find /etc ! -perm -111
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;
[root@localhost ~]# find /etc/init.d -perm -111 -a -perm /002
/etc/init.d