04-Shell编程之六

本文详细介绍了Linux系统管理中常用的Shell命令,包括grep、find、sed和awk的使用,以及crontab的设置方法。grep用于在文件中查找特定内容,find用于根据各种条件查找文件,sed则是一个强大的流编辑器,awk用于按指定分隔符处理一行数据。crontab用于设置周期性任务,是Linux下的定时任务系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6、常用操作命令

文本处理是每一个系统管理员都会频繁接触的任务,其核心内容是相关工具的使用,关键要点在于灵活地结合多个工具去完成任务。

以下所列的文本处理工具中,有些工具比如sed awk 很复杂很强大,有些工具像cat, head, tail 就很单纯,在日常使用中,应侧重于多个工具的配合使用,而不是用一个工具>做完所有的事情。不同的工具有重复的功能,使用哪个工具不是重点,重点是高效地完成任务。 。

cat       <-- 显示文件的全部内容,连接多个文件

head    <-- 获取文件头部的内容

tail       <-- 获取文件尾部的内容

grep    <-- 在文件中查找特定的内容

sed      <-- 强大的流编辑器,能对文件和行中的内容做增加、删除、改动等操作

awk     <-- 模式扫描和处理工具,是一门语言

cut      <-- 从行中抽取部分内容

wc       <-- 计算数据的字节数,字符数,单词数,行数

sort     <-- 排序工具

uniq    <-- 去除重复工具

tr         <-- 对字符做转换,删除,缩减操作

tac      <-- 把文件中的内容按行号反序打印。

rev      <-- 把文件中的行左右反转


常用操作命令 - grep

从文件中抽取符合某种格式的行

常用选项:

#-i          <-- 忽略大小写

#-l          <-- 输出符合条件的文件名

#-n          <-- 显示匹配记录的行号

#-c          <-- 输出匹配的记录的总数

#-o          <-- 输出匹配的那部分,而不是整行

#-w          <-- 匹配单词的边界

#-E          <-- 使用扩展的正则表达式

#-A          <-- 输出下文(after)

#-B          <-- 输出上文(before)

#-C          <-- 输出上下文(context)

#-R          <-- 递归,用于搜索目录下的文件

#-q          <-- 不输出结果,常用于条件测试

#-v          <-- 显示不符合条件的结果


常用操作命令 - find

文件查找工具find

find 可以按照各种条件查找文件,可以把结果输出到标准输出,或者输出到文件中,也可以直接对找到的文件做更进一步的操作。

常用测试:

1. 文件名/路径名

-name                   <-- 测试文件的名字,支持shell glob 的表达方式: *, ?, []

-iname                  <-- -name 相似,不分大小写

2. 文件大小

-empty                  <-- 匹配空文件,或者空目录

-size                      <-- 测试文件的大小

3. uid/gid (ownership)

-uid                      <-- 测试文件的uid

-gid                      <-- 测试文件的gid

-user                    <-- 测试文件的uid 所对应的用户名

-group                 <-- 测试文件的gid 所对应的组名

-nouser                <-- 匹配不属于任何用户的文件

-nogroup             <-- 匹配不属于任何组的文件

4. 文件类型

-type                   <-- 测试文件的类型

  有 7 种类型:

  f (regular file)

  d (directory)

  l (symbolic link)

  b (block special)

  c (character special)

  s (socket)

  p (named pipe)

5. 时间标签

分为相对时间和绝对时间

-amin, -mmin, -cmin, -atime, -mtime, -ctime 表达的都是相对时间

-newerat, -newermt, -newerct 表达的是绝对时间

 

-amin                                       <-- 测试文件的访问时间,单位是分钟

-mmin                                     <-- 测试文件的修改时间,单位是分钟

-cmin                                      <-- 测试文件的inode 修改时间,单位是分钟

-atime (可与 -daystart 配合)    <-- 测试文件的访问时间,单位是24小时

-mtime (可与 -daystart 配合)   <-- 测试文件的修改时间,单位是24小时

-ctime (可与 -daystart 配合)    <-- 测试文件的inode 修改时间,单位是24小时

-newerat                                 <-- 测试文件的访问时间

-newermt                                <-- 测试文件的修改时间

-newerct                                 <-- 测试文件的inode 修改时间

常用操作命令 - sed

流编辑器,常常用于脚本中

基本格式包含以下部分:

1. 指定范围,不明确指定的话,默认是所有的行,可以是行号,或者正则表达式

2. 指定动作,常用的有d, s, p, i, a

    d: delete, 删除

    s: substitute, 替换

    p: print, 打印

    i: insert, 在前面插入

    a: append, 在后面添加

===删除某些行

3,$ 代表对第3至最后一行进行操作             <-- 指定范围

d 代表进行删除(delete)操作                      <-- 指定动作

[czl@mob tmp]$ cat /etc/passwd | sed '3,$d'

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

 

# cat /etc/passwd | sed '3d'          <-- 删除第3

# cat /etc/passwd | sed '10,20d'   <-- 删除第10至第20

 

===替换某些字符

# echo hello | sed 's/l/L/'             <-- 把小写l 换成大写的L

heLlo                                            <-- 只有第一个l被替换

 

# echo hello | sed 's/l/L/g'           <-- 把小写l 换成大写的L

heLLo                                           <-- 加了g,替换所有的l

 

# echo "good morning" | sed 's/morning/afternoon/'

good afternoon


常用操作命令 - awk

比较常用的功能就是按照某个分割符分割一行数据,并输出某些字段(列)

 

===常用的选项:

-F            <--- 字段分割符,可以是一个字符,也可以是多个字符

 

# echo hello world, good morning | awk -F, '{print $1}'

hello world

# echo hello world, good morning | awk -F "good" '{print $2}'

 morning

 

===字段的表示方法:

$0      <--- 整条记录

$1      <--- 1列(字段)

$2      <--- 2列(字段)

$n      <--- n列(字段)

$NF    <--- 最后一个列,NF number of fields 的意思,就是所有字段的总数

 

# head -n1 /etc/passwd | awk -F: '{print $1}'

root

# head -n1 /etc/passwd | awk -F: '{print $0}'

root:x:0:0:root:/root:/bin/bash

# head -n1 /etc/passwd | awk -F: '{print $NF}'

/bin/bash


常用操作命令 - crontab

当需要周期性地重复执行任务,或者需要在将来某个时间点执行某个任务时,可以使用定时任务系统中。

Linux下,定时任务用cron来实现。cron能按照精确到分钟的时间去执行命令,此外,通常还可以设定cron按照每小时,每天,每周,每月,每年的频率去执行任务。cron的定时>任务,如果因为电脑关闭而无法在指定时间执行,开机之后是否会执行,取决于该任务定义在哪个配置文件中,如果是定义在/etc/anacrontab 中,则会执行,否则就不执行。

 

Linux下定时任务的实现,是依靠一个后台运行的系统服务crond (就是一个后台进程而已),该服务每分钟检查一次,并执行符合条件的任务。

service crond status

/etc/init.d/crond status

===> 设定用户级别的定时任务

格式:

特别注意,用户级别的任务定义当中,没有用户名那一栏,如果像定义系统级别的命令那样,输入用户名,crontab编辑器不会提示格式错误,但是任务不会得到正确的执行。

 

.---------------- 分钟 (0 - 59)

|  .------------- 小时 (0 - 23)

|  |  .---------- 一个月中的某一天 (1 - 31)

|  |  |  .------- 月份 (1 - 12)

|  |  |  |  .---- 一周中的某一天 (0 - 6) (07都表示周日)

|  |  |  |  |

*  *  *  * command to be executed

普通用户编辑自己的定时任务

crontab -e               <--- 编辑当前用户自己的定时任务(使用环境变量EDITOR指定的默认编辑器)

crontab -l               <--- 列出当前用户自己所有的定时任务

crontab -r               <--- 删除当前用户自己所有的定时任务

 

作为管理员,root可以设定/调整所有用户的定时任务,命令和上面类似,只是增加了一个-u <username> 的参数

crontab -e -u czl        <--- 编辑指定用户的定时任务(使用环境变量EDITOR指定的默认编辑器)

crontab -l -u czl        <--- 列出指定用户所有的定时任务

crontab -r -u czl        <--- 删除指定用户所有的定时任务


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值