bash的基础特性(3)
1、提供了编程环境
程序:指令 + 数据
程序的编程风格:
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell 程序:提供了编程能力,解释执行
shell 脚本:文本文件
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
运行脚本:
1、给予执行权限,通过具体的文件路径指定文件执行;
2、直接运行解释器,将脚本作为解释器程序的参数运行;
[root@localhost ~]# vim /mnt/file.txt
#!/bin/bash
cat /mnt/file1
"/mnt/file.txt" [New] 2L, 27C written
[root@localhost ~]# chmod 777 /mnt/file.txt
[root@localhost ~]# cd /mnt
[root@localhost mnt]# ./file.txt
dsi love you afd
i love you i love you
grep 及正则表达式
Linux上文本处理三剑客
grep:文本过滤(模式:pattern)工具;
grep, egrep, fgrep
sed: stream editor,文本编辑工具;
awk: Linux上的实现 gawk,文本报告生成器
grep
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
REGEXP:由一类特殊字符及文本字符所编写的模式,其字符不表示字符字面意义,而表示控制或通配的功能,分为基本正则表达式(BRE)和扩展正则表达式(ERE)
grep [OPTIONS] PATTERN [FILE...]
选项:
--color=auto:对匹配到的文本着色显示;
-v: 显示不能够被pattern匹配到的行;
-i: 忽略字符大小写;
-o: 仅显示匹配到的字符串;
-q: 静默模式,不输出任何信息; //使用 echo $? 查看是否执行成功
-A #:after, 后#行 //[root@laptop-u5s7ejrh mnt]# grep two -A 2 file2
-B #: before, 前#行
-C #:context, 前后各#行
-E:使用ERE
基本正则表达式元字符
字符匹配
.: 匹配任意单个字符;
[]: 匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*:匹配前面的字符任意次;
.*:任意长度的任意字符;
\?:匹配其前面的字符0或1次;即前面的可有可无;
[root@localhost ~]# grep 's\?bin' /etc/passwd
\+:匹配其前面的字符至少1次;
[root@localhost ~]# grep 's\+bin' /etc/passwd
\{m\}:匹配前面的字符m次;
[root@localhost ~]# grep 's\{2\}' /etc/passwd
\{m,n\}:匹配前面的字符至少m次,至多n次;
[root@localhost ~]# grep 's\{1,2\}' /etc/passwd
\{0,n\}:匹配前面的字符至多n次;
[root@localhost ~]# grep 'r\{0,1\}' /etc/passwd
\{m,\}:匹配前面的字符至少m次;
[root@localhost ~]# grep 'b\{1,\}' /etc/passwd
位置锚定
^:行首锚定;用于模式的最左侧;
[root@localhost ~]# grep '^root' /etc/passwd
$:行尾锚定;用于模式的最右侧;
[root@localhost ~]# grep 'bash$' /etc/passwd
^PATTERN$: 用于模式匹配整行; //该行所有信息都匹配到才会匹配成功
^$: 空行;
^[[:space:]]*$
\< 或 \b:词首锚定,用于单词模式的左侧; //匹配单词中roo是出现在一个单词前面的
[root@localhost ~]# grep '\<roo' /etc/passwd
\> 或 \b:词尾锚定,用于单词模式的右侧; //匹配单词中tor是出现在次单词的后面的
[root@localhost ~]# grep 'tor\> /etc/passwd
\<PATTERN\>:匹配整个单词;
[root@localhost ~]# grep '\<sync\>' /etc/passwd
分组
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
\(xy\)*ab 表示 xy 出现n次
Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1: ab\+\(xy\)*
\2:xy
后向引用:引用前面的分组括号中的模式所匹配到的字符(也就是匹配到的结果),而非模式本身。
练习:
1、显示 /proc/meminfo 文件中以大小 s 开头的行(用两种方式)
[root@localhost ~]# grep -i '^s' /proc/meminfo
[root@localhost ~]# grep '^[Ss]' /proc/meminfo
2、显示 /etc/passwd 文件中不以/bin/bash结尾的行
[root@localhost ~]# grep -v '/bin/bash$' /etc/passwd
3、显示 /etc/passwd 文件中ID号最大的用户的用户名
[root@localhost ~]# sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1
4、如果用户 root 存在,显示其默认的 shell 程序
[root@localhost ~]# id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
5、找出 /etc/passwd 中的两位或三位数
[root@localhost ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
6、显示 /etc/grub2.cfg 文件中,至少以一个空白字符开头的且后面存非空白字符的行
[root@localhost ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
7、找出"netstat -tan"命令的结果中以’LISTEN’后跟0、1或多个空白字符结尾的行
[root@localhost ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用户bash、testbash、basher以及 nologin (其shell为 /sbin/nologin);而后找出 /etc/passwd 文件中用户名同shell名的行
[root@localhost ~]# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd
练习:
1、写一个脚本,实现如下功能: 如果 user1 用户存在,就显示存在,否则添加,显示添加用户的 id 号等信息
#!/bin/bash
id user1 &> /dev/null && echo "user1 exists." || useradd user1
id user1
2、写一个脚本,完成以下功能:如果 root 用户登录了当前系统,就显示 root 用户在线;否则说明未登录 (命令完成)
whoami | grep "^root\>" &> /dev/null && echo "root logged" || echo "root not logged"