Shell基础学习---4、文本处理工具、综合应用案例(归档文件、发送信息)

简介: Shell基础学习---4、文本处理工具、综合应用案例(归档文件、发送信息)

1、文本处理工具

1.1 cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

1、基本语法

cut [选项参数] filename

说明:默认分割符是制表符

2、选项参数说明

选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列,默认是制表符“\t”
-c 按字符进行切割,后加n表示取第几列

3、案例实操

(1)切割cut.txt第二列(分割符为默认的制表符)

8959b4474e0146d1b7b8549725b4c464.png

(2)切割cut.txt的2、3列

08a39ef6be9946dca0afaa4d972a74cf.png

(3)从cut.txt文件中切割出best

dd9fca51372c49b082c7c724446f361b.png

注意:grep是行搜索!!!

(4)切割ifconfig后打印的IP地址

aaff393a5bae444f8f7db60f42b6b2aa.png

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 

e66eed0783464375b81de9a24b327941.png

(3)搜索passwd文件以root关键字开头的所有行,并输出该行的第一列和第七列,中间用“,”隔开。

awk -F : '/^root/{print $1","$7}' passwd 

37f094ee82534d1981fba92c487b5889.png

注意:只有匹配了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 

6a095dda82af405ab6d86ad9a50fb4c2.png

注意:BEGIN在所有数据读取之前执行;END在所有数据执行之后执行

(5)将passwd文件中的用户id增加数值1并输出

awk -v i=1 -F : '{print $3+i}' passwd 

ceea7577a68444a9a6996d51c7b254be.png

4、awk的内置变量

变量 说明
FILENAME 文件名
NR 已读的记录数
NF 浏览记录的域的个数

5、案例实操

(1)统计passwd文件名,每行的行号,每行的列数

 awk -F : '{print "filename:" FILENAME ",linenum" NR ",col" NF}' passwd 

90c93d6cf6e24febbaed119544de689d.png

(2)查询ifconfig命令输出结果中的空行所在的行号

ifconfig | awk '/^$/{print NR}'

146a31d3edcc45e583e08c93cfac8f9a.png(3)切割IP

ifconfig ens33 | awk '/netmask/ {print $2}'

8e55e18acb554f9780b6980ecbe33498.png

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

825fa0c669bd4831800a26eba8100a9b.png

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、发送方

b55598b962e64f799fd7432ad45b3674.png

2、接受方

0947e344c56e4ec29e3a1491629b09ef.png

相关文章
|
1月前
|
Shell
Shell 文件包含
10月更文挑战第5天
33 4
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
62 12
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
332 2
|
2月前
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
45 8
|
3月前
|
Shell Linux 网络安全
在Linux中,如何利用Shell把10台主机的当前时间写到一个文件里边?
在Linux中,如何利用Shell把10台主机的当前时间写到一个文件里边?
|
3月前
|
Shell Linux 开发工具
在Linux中,如何编写shell脚本将当前目录下大于10K的文件转移到/tmp目录下?
在Linux中,如何编写shell脚本将当前目录下大于10K的文件转移到/tmp目录下?
|
3月前
|
Shell Linux Perl
在Linux中,编写一个shell脚本,用于统计指定目录下所有文件的行数。
在Linux中,编写一个shell脚本,用于统计指定目录下所有文件的行数。
|
25天前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
68 1
|
11天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
35 2
6种方法打造出色的Shell脚本
下一篇
无影云桌面