Shell复习3
1.正则表达式入门
(1)^
^是一个正则表达式的开头。
用法为:
xxx | grep ^a
意思是通过这个管道的数据找到以a为开头的数据
(2)$
$是一个正则表达式的结束
用法为:
xxx | grep b$
意思是通过这个管道的数据找到以b为结尾的数据
(3).
.是一个正则表达式匹配任意一个字符
用法为:
xxx | grep r..t
意思是通过这个管道的数据找到rxxt的数据,例如root,rxdt,raat等等
(4)*
*用法是上一个字符出现0或者多次
用法为:
xxx | grep ro*t
意思是通过一个管道的数据找到ro(0次或多次)t的数据例如rt,rot,root等等
(5).*
匹配任意字符
(6)[]
表示匹配一个范围的字符
用法为:
[6,8]
[0-9]
[a-c,e-f]
第一个意思是匹配6或8,第二个意思是匹配0到9任意一个字符,第三个意思是匹配a到c任意一个字符或者e到f任意一个字符
(7)\
表示转义字符
用法为:
xxx | grep "a\$b"
意思是匹配包含a$b的所有行
2.文本处理工具
1.cut
(1)cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每 一行剪切字节、字符和字段并将这些字节、字符和字段输出。
(2)参数说明
-f 列号,提取第几列
-d 分割符,默认是以\t分割
-c 指按照字符切割后取第几列
例如:
dong shen
guan zhen
wo wo
lai lai
le le
要求我们切割出guan,例如这个文件叫cut.txt
代码如下:
cat cut.txt | grep guan | cat -d " " -f 1
意思是展示cut.txt中包含guan的行并且以空格分隔,并且只取第一列
2.awk
(1)一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开 的部分再进行分析处理。
(2)参数说明
-F 指定输入文件的分隔符
-v 赋值一个用户定义变量
(3)基本用法
awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}…’
filename pattern:表示 awk 在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
例如
搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 7 列。
代码如下:
awk -F : '/^root/{print $7}' passwd /bin/bash
意思是找到包含root的关键字为开头的行,通过:来分割,并且输出分割之后的第7列
注意:只有匹配了 pattern 的行才会执行 action。
(4)awk内置变量
FILENAME,文件名
NR,已读行数
NF,切割后列的个数
3.综合案例
发送信息:
我们可以利用 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