五种常用文本工具和Crontab调度工具(一)
- cut: 用于从文本中提取特定的字段或列。
- grep: 用于搜索文本中的特定模式。
- awk: 用于处理和分析文本。
- sed: 用于文本替换和编辑。
- sort: 用于对文本行进行排序。
Crontab
Crontab 是用于定时任务调度的工具,可以用来定期执行脚本或命令。通过设定特定的时间表达式,来控制任务的执行频率。
这两类工具在功能和用途上有很大不同,但都在命令行环境中非常常用。
1. cut
命令
常用选项
-d <delimiter>
: 指定字段分隔符。-f <fields>
: 指定要提取的字段。
文件 1 内容 (cut_example.txt
)
apple banana
orange grape
kiwi lemon
melon berry
案例实操
-
切割
cut_example.txt
的第一列cut -d " " -f 1 cut_example.txt
输出:
apple orange kiwi melon
-
切割
cut_example.txt
的第二列cut -d " " -f 2 cut_example.txt
输出:
banana grape lemon berry
文件 2 内容 ( data.txt
)
apple,10,red
banana,20,yellow
grape,30,purple
- 提取
data.txt
第二列和第三列:
cut -d ',' -f 2,3 data.txt
输出:
10,red
20,yellow
30,purple
2. sed
命令
常用选项
-
a
(append)- 在指定行后追加文本。
-
d
(delete)- 删除指定行。
-
s
(substitute)- 用于替换文本。
文件内容 (sed_example.txt
)
apple banana
orange grape
kiwi lemon
melon berry
案例实操
-
在第三行下插入新行
sed '3a fruit salad' sed_example.txt
输出:
apple banana orange grape kiwi lemon fruit salad melon berry
-
删除包含
kiwi
的行sed '/kiwi/d' sed_example.txt
输出:
apple banana orange grape melon berry
-
将
melon
替换为watermelon
sed 's/melon/watermelon/' sed_example.txt
输出:
apple banana orange grape kiwi lemon watermelon berry
3. awk
命令
常用选项
-F <delimiter>
: 指定输入字段分隔符。-v <var=value>
: 定义和传递外部变量。
正则表达式匹配:
/.*/
匹配所有行。/pattern/
匹配包含pattern
的行。/^pattern/
匹配以pattern
开头的行。/pattern$/
匹配以pattern
结尾的行。
条件判断:
$1 == "root"
:匹配第一个字段等于"root"
的行。$3 > 1000
:匹配第三个字段大于1000
的行。
案例1 文件内容 (/etc/passwd
示例)
root:x:0:0:root:/root:/bin/bash
user:x:1000:1000:User:/home/user:/bin/bash
-
搜索以
root
开头的所有行,并输出第7列awk -F: '/^root/{print $7}' /etc/passwd awk -F':' '\$1 == "root" {print \$7}' /etc/passwd
输出:
/bin/bash
-
输出第1列和第7列,中间以逗号分隔
awk -F: '/^root/{print $1 "," $7}' /etc/passwd
输出:
root,/bin/bash
-
用户ID增加1并输出
awk -v i=1 -F: '{print $3+i}' /etc/passwd
输出:
1 1001
-
统计文件名、行号、列数
awk -F: '{print "filename:" FILENAME ", linenumber:" NR ", columns:" NF}' /etc/passwd
输出:
filename:/etc/passwd, linenumber:1, columns:7 filename:/etc/passwd, linenumber:2, columns:7
-
FILENAME
–FILENAME
是awk
的内置变量,表示当前正在处理的文件名。在这个例子中,它会输出/etc/passwd
。 -
NR
–NR
是awk
的内置变量,表示当前的行号。每读取一行记录,NR
将自动递增。 -
NF
–NF
是awk
的内置变量,表示当前行的字段数。对于每一行,NF
会计算根据指定分隔符(这里是:
)分隔出来的字段数量。
-
-
提取 IP 地址
ifconfig ens33 | grep "inet " | awk -F" " '{print $2}'
输出: (假设 IP 为
192.168.1.102
)192.168.1.102
案例2 假设 data.txt
内容为:
apple 10
banana 20
grape 30
kiwi 40
melon 50
-
使用
-F
指定分隔符如果文件使用逗号分隔:
awk -F ',' '{print $1, $2}' data.txt
-
使用
-v
传递变量(不使用-F
指定时默认使用空格分隔,cut
切割取第几列时需要考虑连续空格的第几个空格,而awk
不需要考虑,多个连续空格会视为一个)找到数量大于某个值的水果:
awk -v threshold=25 '{if ($2 > threshold) print $1, $2}' data.txt awk -v threshold=25 '$2 > threshold {print$1, $2}' data.txt
输出:
grape 30 kiwi 40 melon 50
-
简单的计算
计算每行的数量乘以2:
awk '{print $1, $2 * 2}' data.txt
输出:
apple 20 banana 40 grape 60 kiwi 80 melon 100