网站建设色,建设网站方法,常用微信小程序api,昆山兼职做网站第 9 章 正则表达式入门
正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文 本编辑器里#xff0c;正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中#xff0c;grep#xff0c; sed#xff0c;awk 等文本处理工具都支持…第 9 章 正则表达式入门
正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文 本编辑器里正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中grep sedawk 等文本处理工具都支持通过正则表达式进行模式匹配。 9.1 常规匹配 一串不包含特殊字符的正则表达式匹配它自己例如
[atguiguhadoop101 shells]$ cat /etc/passwd | grep atguigu 就会匹配所有包含 atguigu 的行。
9.2 常用特殊字符 1特殊字符^ ^ 匹配一行的开头例如
[atguiguhadoop101 shells]$ cat /etc/passwd | grep ^a 会匹配出所有以 a 开头的行 2特殊字符$ $ 匹配一行的结束例如
[atguiguhadoop101 shells]$ cat /etc/passwd | grep t$会匹配出所有以 t 结尾的行 思考^$ 匹配什么
3特殊字符. . 匹配一个任意的字符例如
[atguiguhadoop101 shells]$ cat /etc/passwd | grep r..t会匹配包含 rabt,rbbt,rxdt,root 等的所有行 4特殊字符*
不单独使用他和上一个字符连用表示匹配上一个字符 0 次或多次例如
[atguiguhadoop101 shells]$ cat /etc/passwd | grep ro*t会匹配 rt, rot, root, rooot, roooot 等所有行 思考.* 匹配什么
5字符区间中括号[ ] [ ] 表示匹配某个范围内的一个字符例如 [6,8]------匹配 6 或者 8 [0-9]------匹配一个 0-9 的数字 [0-9]------匹配任意长度的数字字符串 [a-z]------匹配一个 a-z 之间的字符 [a-z] ------匹配任意长度的字母字符串 [a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符
[atguiguhadoop101 shells]$ cat /etc/passwd | grep r[a,b,c]*t会匹配 rt,rat, rbt, rabt, rbact,rabccbaaacbt 等等所有行
6特殊字符 \ 表示转义并不会单独使用。由于所有特殊字符都有其特定匹配模式当我们想匹配 某一特殊字符本身时例如我想找出所有包含 ‘$’ 的行就会碰到困难。此时我们就要 将转义字符和特殊字符连用来表示特殊字符本身例如
[atguiguhadoop101 shells]$ cat /etc/passwd | grep ‘a\$b’就会匹配所有包含 a$b 的行。注意需要使用单引号将表达式引起来。
第 10 章 文本处理工具 10.1 cut cut 的工作就是“剪”具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每 一行剪切字节、字符和字段并将这些字节、字符和字段输出。
1基本用法
cut [选项参数] filename 说明默认分隔符是制表符
2选项参数说明 3案例实操 1数据准备
[atguiguhadoop101 shells]$ touch cut.txt
[atguiguhadoop101 shells]$ vim cut.txt
dong shen
guan zhen
wo wo
lai lai
le le2切割 cut.txt 第一列
[atguiguhadoop101 shells]$ cut -d -f 1 cut.txt
dong
guan
wo
lai
le 3切割 cut.txt 第二、三列
[atguiguhadoop101 shells]$ cut -d -f 2,3 cut.txt
shen
zhen
wo
laile4在 cut.txt 文件中切割出 guan
[atguiguhadoop101 shells]$ cat cut.txt |grep guan | cut -d -f 1
guan5选取系统 PATH 变量值第 2 个“”开始后的所有路径
[atguiguhadoop101 shells]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/
home/atguigu/
[atguiguhadoop101 shells]$ echo $PATH | cut -d : -f 3-
/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/atguigu/bin 6切割 ifconfig 后打印的 IP 地址
[atguiguhadoop101 shells]$ ifconfig ens33 | grep netmask | cut -d -f 10
192.168.111.10110.2 awk 一个强大的文本分析工具把文件逐行的读入以空格为默认分隔符将每行切片切开 的部分再进行分析处理。 1基本用法 awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}…’ filename pattern表示 awk 在数据中查找的内容就是匹配模式 action在找到匹配内容时所执行的一系列命令 2选项参数说明 3案例实操 1数据准备
[atguiguhadoop101 shells]$ sudo cp /etc/passwd ./
passwd 数据的含义 用户名:密码(加密过后的):用户 id:组 id:注释:用户家目录:shell 解析器 2搜索 passwd 文件以 root 关键字开头的所有行并输出该行的第 7 列。
[atguiguhadoop101 shells]$ awk -F : /^root/{print $7} passwd
/bin/bash3搜索 passwd 文件以 root 关键字开头的所有行并输出该行的第 1 列和第 7 列 中间以“”号分割。
[atguiguhadoop101 shells]$ awk -F : /^root/{print $1,$7} passwd
root,/bin/bash注意只有匹配了 pattern 的行才会执行 action。 4只显示/etc/passwd 的第一列和第七列以逗号分割且在所有行前面添加列名 user
shell 在最后一行添加dahaige/bin/zuishuai。
[atguiguhadoop101 shells]$ awk -F : BEGIN{print user, shell} {print $1,$7}
END{print dahaige,/bin/zuishuai} passwd
user, shell
root,/bin/bash
bin,/sbin/nologin 。。。
atguigu,/bin/bash
dahaige,/bin/zuishuai注意BEGIN 在所有数据读取行之前执行END 在所有数据执行之后执行。 5将 passwd 文件中的用户 id 增加数值 1 并输出
[atguiguhadoop101 shells]$ awk -v i1 -F : {print $3i} passwd
1
2
3
44awk 的内置变量 5案例实操 1统计 passwd 文件名每行的行号每行的列数
[atguiguhadoop101 shells]$ awk -F : {print filename: FILENAME ,linenum:
NR ,col:NF} passwd
filename:passwd,linenum:1,col:7
filename:passwd,linenum:2,col:7
filename:passwd,linenum:3,col:7… 2查询 ifconfig 命令输出结果中的空行所在的行号
[atguiguhadoop101 shells]$ ifconfig | awk /^$/{print NR}
9
18
263切割 IP
[atguiguhadoop101 shells]$ ifconfig ens33 | awk /netmask/ {print $2}
192.168.6.101第 11 章 综合应用案例
11.1 归档文件 实际生产应用中往往需要对重要数据进行归档备份。 需求实现一个每天对指定目录归档备份的脚本输入一个目录名称末尾不带/ 将目录下所有文件按天归档保存并将归档日期附加在归档文件名上放在/root/archive 下。 这里用到了归档命令tar 后面可以加上-c 选项表示归档加上-z 选项表示同时进行压缩得到的文件后缀名 为.tar.gz。 脚本实现如下 #!/bin/bash
首先判断输入参数个数是否为 1
if [ $# -ne 1 ]
then
echo 参数个数错误应该输入一个参数作为归档目录名
exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
then
echo
else
echo
echo 目录不存在
echo
exit
fi
DIR_NAME$(basename $1)
DIR_PATH$(cd $(dirname $1); pwd)
# 获取当前日期
DATE$(date %y%m%d)
# 定义生成的归档文件名称
FILEarchive_${DIR_NAME}_$DATE.tar.gz
DEST/root/archive/$FILE
# 开始归档目录文件
echo 开始归档...
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo 归档成功
echo 归档文件为$DEST
echo
else
echo 归档出现问题
echo
fi
exit11.2 发送消息 我们可以利用 Linux 自带的 mesg 和 write 工具向其它用户发送消息。 需求实现一个向某个用户快速发送消息的脚本输入用户名作为第一个参数后面直 接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能以及当前发 送消息是否为空。 脚本实现如下
#!/bin/bash
login_user$(who | grep -i -m 1 $1 | awk {print $1})
if [ -z $login_user ]
then
echo $1 不在线
echo 脚本退出..
exit
fi
is_allowed$(who -T | grep -i -m 1 $1 | awk {print $2})
if [ $is_allowed ! ]
then
echo $1 没有开启消息功能
echo 脚本退出..
exit
fi
if [ -z $2 ]
then
echo 没有消息发出
echo 脚本退出..
exit
fi
whole_msg$(echo $* | cut -d -f 2- )
user_terminal$(who | grep -i -m 1 $1 | awk {print $2})
echo $whole_msg | write $login_user $user_terminal
if [ $? ! 0 ]
then
echo 发送失败
else
echo 发送成功
fi
exit