Shell脚本编程基础(四)

五种常用文本工具和Crontab调度工具(一)

  1. cut: 用于从文本中提取特定的字段或列。
  2. grep: 用于搜索文本中的特定模式。
  3. awk: 用于处理和分析文本。
  4. sed: 用于文本替换和编辑。
  5. sort: 用于对文本行进行排序。

Crontab

Crontab 是用于定时任务调度的工具,可以用来定期执行脚本或命令。通过设定特定的时间表达式,来控制任务的执行频率。

这两类工具在功能和用途上有很大不同,但都在命令行环境中非常常用。

1. cut 命令

常用选项
  • -d <delimiter>: 指定字段分隔符。
  • -f <fields>: 指定要提取的字段。
文件 1 内容 (cut_example.txt)
apple banana
orange grape
kiwi lemon
melon berry
案例实操
  1. 切割 cut_example.txt 的第一列

    cut -d " " -f 1 cut_example.txt
    

    输出:

    apple
    orange
    kiwi
    melon
    
  2. 切割 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
  1. 提取data.txt第二列和第三列:
cut -d ',' -f 2,3 data.txt

输出:

10,red
20,yellow
30,purple

2. sed 命令

常用选项
  1. a (append)

    • 在指定行后追加文本。
  2. d (delete)

    • 删除指定行。
  3. s (substitute)

    • 用于替换文本。
文件内容 (sed_example.txt)
apple banana
orange grape
kiwi lemon
melon berry
案例实操
  1. 在第三行下插入新行

    sed '3a fruit salad' sed_example.txt
    

    输出:

    apple banana
    orange grape
    kiwi lemon
    fruit salad
    melon berry
    
  2. 删除包含 kiwi 的行

    sed '/kiwi/d' sed_example.txt
    

    输出:

    apple banana
    orange grape
    melon berry
    
  3. 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
  1. 搜索以 root 开头的所有行,并输出第7列

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

    输出:

    /bin/bash
    
  2. 输出第1列和第7列,中间以逗号分隔

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

    输出:

    root,/bin/bash
    
  3. 用户ID增加1并输出

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

    输出:

    1
    1001
    
  4. 统计文件名、行号、列数

    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
    
    1. FILENAME
      FILENAMEawk 的内置变量,表示当前正在处理的文件名。在这个例子中,它会输出 /etc/passwd

    2. NR
      NRawk 的内置变量,表示当前的行号。每读取一行记录,NR 将自动递增。

    3. NF
      NFawk 的内置变量,表示当前行的字段数。对于每一行,NF 会计算根据指定分隔符(这里是 :)分隔出来的字段数量。

  5. 提取 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
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值