网站Logo linux从入门到入土

Linux四剑客与正则表达式完全指南:从基础到高级应用

admin
10
2022-08-10

Linux四剑客与正则表达式完全指南:从基础到高级应用

1. 特殊符号深度解析

1.1 引号系列 ⭐⭐⭐⭐⭐

重点:单引号、双引号、不加引号、反引号的区别与应用

引号类型 功能说明 示例
反引号 `` 优先执行内部命令 `whoami`
单引号 '' 所见即所得,完全原样输出 'aaa $USER'
双引号 "" 支持变量替换和命令执行 "aaa $USER"
不加引号 支持变量、命令、通配符和花括号扩展 aaa {01..05}

实际演示:

echo "`aaa` `whoami`  $(pwd)   xiaozhi{01..5} *"
# 输出:`aaa` root /home/user xiaozhi{01..5} file1 file2 file3

echo '`aaa` `whoami` $(pwd)   xiaozhi{01..5} *'
# 输出:`aaa` `whoami` $(pwd)   xiaozhi{01..5} *

echo `aaa` `whoami`  $(pwd)   xiaozhi{01..5} *
# 输出:`aaa` root /home/user xiaozhi01 xiaozhi02 xiaozhi03 xiaozhi04 xiaozhi05 file1 file2 file3

1.2 重定向符号 ⭐⭐⭐⭐⭐

标准输出重定向

符号 功能 使用场景
>1> 标准输出重定向 创建文件、清空内容
>>1>> 标准输出追加重定向 追加内容到文件末尾

错误输出重定向

符号 功能 使用场景
2> 标准错误输出重定向 单独处理错误信息
2>> 标准错误输出追加重定向 追加错误信息

高级重定向技巧

# 正确和错误信息都写入同一文件(脚本和定时任务常用)
command >> `aaa`.log 2>&1

# 输入重定向(与tr、xargs等命令配合使用)
tr 'a-z' 'A-Z' < passwd

# 多行内容写入文件(批量配置常用)
cat >> file.txt << EOF
第一行内容
第二行内容
...
EOF

实用案例

# 字符大小写转换
tr 'a-z' 'A-Z' < passwd

# 控制参数显示列数
seq 10 > num.txt
xargs -n3 < num.txt
# 输出:1 2 3
#       4 5 6
#       7 8 9
#       10

2. 正则表达式精通

2.1 正则表达式概述

  • 应用场景:Linux四剑客(grep、sed、awk、find)、编程语言(Python、Go、Java)
  • 核心作用:精确的字符匹配和过滤
  • 注意事项:使用英文符号,建议配置颜色高亮

2.2 正则符号分类

类型 包含符号 支持命令
基础正则 ^ $ ^$ . * .* [] [^] grep、sed、awk
扩展正则 + {} () ? | egrep、sed -r、awk

2.3 测试文件准备

cat > /xiaozhi/re.txt << EOF
I am good teacher!
I teach linux.

I like badminton ball ,billiard ball and 
chinese chess!
my blog is http://www.blog.51cto.com  
our size is http://blog.xiaozhi.com  

my qq is 49000448
not 4900000448.


EOF

2.4 基础正则表达式详解

1) ^ - 行首匹配

grep '^I' re.txt
# 匹配所有以"I"开头的行

2) $ - 行尾匹配

grep '!$' re.txt
# 匹配所有以"!"结尾的行

3) ^$ - 空行匹配

# 排除空行和注释行(配置文件处理常用)
egrep -v '^$|#' re.txt

# 实际应用:查看sshd有效配置
egrep -v '^$|#' /etc/ssh/sshd_config

4) . - 任意单个字符

# 匹配任意非空字符(了解即可,常与*配合使用)

5) * - 前字符0次或多次出现

# .* 组合:匹配任意内容(最常用)
grep '^I.*!$' re.txt
# 匹配以I开头、!结尾的整行

6) [abc] - 字符集匹配

# 匹配特定字符开头
grep '^[Imn]' re.txt

# 匹配特定字符结尾
egrep '^[Imn].*[0-9!]$' re.txt

# 字符类型过滤
grep '[a-z]' re.txt    # 小写字母
grep '[A-Z]' re.txt    # 大写字母  
grep '[0-9]' re.txt    # 数字

7) [^abc] - 字符集排除

grep '[^abc]' re.txt
# 匹配不包含a、b、c中任意字符的行

8) 特殊字符转义

grep '\.$' re.txt
# 匹配以点号结尾的行(点号需要转义)

2.5 扩展正则表达式进阶

1) | - 或运算

# 多条件进程过滤
ps -ef | egrep 'sshd|rsyslog'

2) + - 前字符1次或多次出现

# 匹配连续字母(单词提取)
egrep '[a-z]+' re.txt

# 统计单词频率
egrep -o '[a-zA-Z]+' re.txt | sort | uniq -c | sort -nr | head -5

# 统计字母频率  
egrep -o '[a-zA-Z]' re.txt | sort | uniq -c | sort -nr | head -5

3) {n,m} - 次数范围匹配

# 匹配重复字符
egrep 'x{3,5}' re.txt

# IP地址匹配(经典案例)
egrep '([0-9]{1,3}\.){3}[0-9]{1,3}' re.txt

4) () - 分组匹配

# CPU缓存信息提取
export LANG=en_US.UTF-8
lscpu | egrep -i 'L(1d|1i|2|3) cache'

# 精简写法
lscpu | egrep -i 'L(1[di]|2|3) cache'
lscpu | egrep -i 'L(1[di]|[23]) cache'

5) ? - 前字符0次或1次出现

cat > test.txt << EOF
good
goooood
gd
god
gooood
EOF

egrep 'go?d' test.txt    # 匹配:gd, god
egrep 'go+d' test.txt    # 匹配:good, goooood, god, gooood  
egrep 'go*d' test.txt    # 匹配:所有行

3. Awk命令实战应用

3.1 列处理技巧

# 基本列提取
awk -F ':' '{print $1, $2, $NF}' /etc/passwd

# 复杂分隔符:提取IP地址
ip a s ens33 | awk -F '[ /]+' 'NR==3{print $3}'

# 多分隔符:提取系统运行时间
awk -F 'up +|, +[0-9]+ user' '{print $2}' w.txt

3.2 行处理技巧

# 按行号提取
awk 'NR==3' file.txt           # 第3行
awk 'NR>=3' file.txt           # 第3行及以后
awk 'NR>=3 && NR<=10' file.txt # 第3-10行

# 正则匹配行
awk '/root|aaa/' /etc/passwd    # 包含root或aaa的行
awk '/^root/' /etc/passwd          # root开头的行
awk '/bash$/' /etc/passwd          # bash结尾的行

4. 核心知识点总结

必须掌握的技能

  1. 引号区别:理解不同引号的行为差异
  2. 重定向:熟练掌握输出重定向和错误处理
  3. 基础正则^ $ . * [] 等符号的熟练应用
  4. 扩展正则| + {} () ? 的高级匹配技巧
  5. Awk应用:列提取、行过滤、复杂分隔符处理

实战应用场景

  • 日志分析:使用正则过滤关键信息
  • 配置处理:排除空行和注释,提取有效配置
  • 数据提取:从命令输出中精确提取所需字段
  • 批量处理:结合重定向进行文件操作
动物装饰