1、文本处理工具
1.1 cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
1、基本语法
cut [选项参数] filename
说明:默认分割符是制表符
2、选项参数说明
选项参数 | 功能 |
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列,默认是制表符“\t” |
-c | 按字符进行切割,后加n表示取第几列 |
3、案例实操
(1)切割cut.txt第二列(分割符为默认的制表符)
(2)切割cut.txt的2、3列
(3)从cut.txt文件中切割出best
注意:grep是行搜索!!!
(4)切割ifconfig后打印的IP地址
1.2 awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行处理。
1、基本语法
awk [选项参数] '/pattern1{action} /pattern/{action2}...' filename pattern :表示awk在数据中查找的内容,就是匹配模式 action:在找到匹配内容时所执行的一系列命令
2、选项参数说明
选项参数 | 功能 |
-F | 指定输入文件分隔符 |
-v | 赋值一个用户定义变量 |
3、案例实操
(1)数据准备。
cp /etc/passwd ./
(2)搜索passwd文件以root关键字开头的所有行,并输出该行的第七列。
awk -F : '/^root/{print $7}' passwd
(3)搜索passwd文件以root关键字开头的所有行,并输出该行的第一列和第七列,中间用“,”隔开。
awk -F : '/^root/{print $1","$7}' passwd
注意:只有匹配了pattern的行才会执行action
(4)只显示passwd的第一列和第七列,以都好分割,且在所有行前面添加列名“good good study”,在最后一行添加“day day up”。
awk -F : 'BEGIN{print "good good study"} {print $1","$7} END{print "day day up"}' passwd
注意:BEGIN在所有数据读取之前执行;END在所有数据执行之后执行
(5)将passwd文件中的用户id增加数值1并输出
awk -v i=1 -F : '{print $3+i}' passwd
4、awk的内置变量
变量 | 说明 |
FILENAME | 文件名 |
NR | 已读的记录数 |
NF | 浏览记录的域的个数 |
5、案例实操
(1)统计passwd文件名,每行的行号,每行的列数
awk -F : '{print "filename:" FILENAME ",linenum" NR ",col" NF}' passwd
(2)查询ifconfig命令输出结果中的空行所在的行号
ifconfig | awk '/^$/{print NR}'
(3)切割IP
ifconfig ens33 | awk '/netmask/ {print $2}'
2、综合应用案例
2.1 归档文件
实际生产应用中,往往需要对重要数据进行归档备份。
需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive下。
这里用到了归档命令:tar
后面可以加上-c选项表示规定,加上-z选项表示同时进行压缩,得到的文件后缀名为tar.gz。
#!/bin/bash #首先判断输入参数个数是否为1 if [ $# -ne 1 ] then echo "参数个数错误!应该输入一个参数,作为归档目录名" exit fi #从参数中获取目录名称 if[ -d $i ] then echo else echo echo "目录不存在!" echo exit fi DIR_NAME=$(basename $1) DIR_PATH=$(cd $(dirname $1);pwd) #获取当前日期 DATE=$(date +%y%m%d) #定义生成的归档文件名称 FILE =archive_${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 exit
2.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
1、发送方
2、接受方