综合实用案例
归档文件
实际生产应用中,往往需要对重要的数据进行归档备份。
需求:实现一个每天对指定目录归档的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive下。
这里用到了归档命令:tar
条件判断里,判断是否目录正确存在用-d,是否文件正确存在用-f。
后面可以加上-c选项表示归档,加上-z选项表示同时进行压缩,得到文件后缀名为.tar.gz。
正则表达式
正则表达式使用单个字符来描述、匹配一系列符号某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep、sed、awk等文本处理工具都支持通过正则表达式进行模式匹配。
常规匹配
一串不包含特殊字符的正则表达式匹配它自己,例如:
cat /etc/passwd | grep atguigu
就会匹配所有包含atguigu的行。
常用特殊字符
-n显示行号
1.特殊字符:^
^匹配一行的开头,例如 ^a,会匹配出所有以a开头的行
2.特殊字符:$
$匹配一行的结束,例如t$,会匹配出所有以t结尾的行
3.特殊字符: .
. 匹配一个任意字符,例如r..t,会匹配r..t格式的所有行
4.特殊字符:*
*不单独使用,他和上一个字符连用,表示匹配上一个字符0次或多次,例如,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之间的任意字符
6.特殊字符:\
\表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含‘$’的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如 'a\$b',就会匹配所有包含a$b的行。注意需要使用单引号将表达式引起来。
文本处理工具
cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
cut 【选项】filename
说明:默认分隔符是制表符
选项:
-f:列号,提取第几列;(可以使用n-n范围显示,n为数字,或者-n和n-,分别表示n之前所有和n之后所有)
-d:分隔符,按照指定分隔符分割列,默认是制表符“\t”;
-c:按字符进行切割 后加n 表示取第几列 比如,-c 1;
awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。(awk与cut相比不需要考虑信息最前的多个空格)
awk【选项】‘/pattern1/{action1} pattern2/{action2}...’ filename
pattern:表示awk在数据中查找的内容,就是匹配模式;
action:在找到匹配内容时所执行的一系列命令;awk自带了输出参数print,并且可以$n,n为数字,输出第n列。
选项:
-F:指定输入文件分隔符
-v:赋值一个用户定义变量
关键字:
BEGIN:在所有数据在读取之前要做的操作
END:在所有数据读取之后要做的操作
内置变量:
FILENAME:文件名
NR:已读的记录数(行号)
NF:浏览记录的域的个数(切割后,列的个数)
综合应用案例
发送消息
我们可以利用Linux自带的mesg和write工具,向其它用户发送消息。
需求:实现一个向某个用户快速发送消息的脚本,输入用户名作为第一个参数,后面直接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能,以及当前发送消息是否为空。
mesg:查看当前用户的消息功能是否打开。
mesg n:关闭当前用户的消息功能,开启则是y。
who -T:可以查看所有用户的消息功能是否打开。
grep【选项】
选项:
-i:忽略大小写;
-m 数字:需要匹配几行;
if中条件判断里,-z可以用来判断是否为空。
who指令得出的用户名参数会太长,可以用awk取第一列解决。
write用法:echo $user_msg | write $get_user $user_terminal
完结散花!