Linux三剑客

grep

grep 是一个非常强大的文本搜索工具,它使用正则表达式来搜索文本,并将匹配的行打印到标准输出。grep 全称是 "Global Regular Expression Print",它用于在文件或输出中搜索包含指定模式的行,支持多种正则表达式语法,提供灵活的搜索能力。

常用命令:

  1. 搜索字符串

    grep "search_string" filename
    

    在文件 filename 中搜索包含 search_string 的文本行。

  2. 忽略大小写搜索

    grep -i "search_string" filename
    

    使用 -i 选项执行不区分大小写的搜索。

  3. 输出行号

    grep -n "search_string" filename
    

    使用 -n 选项在输出中包含行号。

  4. 统计匹配行的数量

    grep -c "search_string" filename
    

    使用 -c 选项统计匹配的行数。

  5. 显示不包含指定模式的行

    grep -v "search_string" filename
    

    使用 -v 选项反转搜索,显示不匹配的行。

  6. 搜索多个文件

    grep "search_string" file1 file2
    

    搜索多个文件,查找包含 search_string 的行。

  7. 递归搜索

    grep -r "search_string" directory/
    

    使用 -r 选项在目录 directory 及其子目录下的所有文件中递归搜索。

  8. 输出匹配字符串前后的行

    grep -B num -A num "search_string" filename
    

    使用 -B (before) 和 -A (after) 选项输出匹配行前后的 num 行。

  9. 正则表达式搜索

    grep -E "regex_pattern" filename
    

    使用 -E 选项执行扩展的正则表达式搜索。

  10. 匹配多个模式

    grep -e "pattern1" -e "pattern2" filename
    

    使用 -e 选项可以指定多个匹配模式。

awk

awk 是一种编程语言,专门设计用于文本处理和数据抽取,awk 以行为处理单位,可以对每一行进行模式匹配并执行相应的动作,awk 程序的基本结构是 'pattern {action}',其中 pattern 是用于匹配行的模式,action 是对匹配行执行的命令。

常用命令:

  1. 打印文件内容

    awk '{print}' filename
    

    打印文件 filename 的所有内容,等同于 cat 命令。

  2. 打印特定列

    awk '{print $1, $3}' filename
    

    打印文件 filename 中的 第一列第三列 的内容。

  3. 指定分隔符分割列

    awk -F',' '{print $1, $2}' filename
    

    使用 -F 选项指定逗号为字段分隔符,然后打印 第一列第二列

  4. 模式匹配

    awk '/pattern/ {print $0}' filename
    

    只打印包含 pattern 的行。

  5. 条件语句

    awk '$1 > 100 {print $0}' filename
    

    如果第一列的值大于 100,则打印整行。

  6. 多个命令

    awk '{print $1; print $2}' filename
    

    对每一行打印 第一列 后,再打印 第二列

  7. 内置变量

    awk 'BEGIN {FS=","; OFS=" - "} {print $1, $2}' filename
    

    BEGIN 块设置字段分隔符 FS 和输出字段分隔符 OFS,然后打印用 " - " 分隔的第一列和第二列。

  8. 模式匹配和计算

    awk '/pattern/ {count++} END {print count}' filename
    

    计算匹配 pattern 的行数并在结束时打印。

  9. 范围模式

    awk '/start_pattern/,/end_pattern/' filename
    

    打印从匹配 start_pattern 到匹配 end_pattern 之间的所有行。

  10. 脚本文件

    awk -f script.awk filename
    

    从脚本文件 script.awk 中读取 awk 命令并执行。

awk 是一种功能强大的工具,适合处理复杂的文本处理任务,如报告生成、数据提取和转换等。

awk 变量

内置变量

cat filename
user1:password1:UID1:GID1:GECOS1:directory1:shell1
user2:password2:UID2:GID2:GECOS2:directory2:shell2

# FS : 输入字段的分隔符,默认为空白字符
awk -v FS=':' '{print $1,$2}' filename
user1 password1
user2 password2

# OFS : 输出字段的分隔符,默认为空白字符
awk -v FS=':' -v OFS='---' '{print $1,$2}' filename
user1---password1
user2---password2

# RS : 输入记录的分隔符,默认情况下是换行符,意味着 awk 通常按行读取输入
# 如以冒号 ':' 为记录分隔符,将每个记录(在这里是由冒号分隔的文本块)分割成字段,并打印出每个记录的第一个字段和第二个字段。
awk -v RS=':' '{print $1,$2}' filename
user1
password1
UID1
GID1
GECOS1
directory1
shell1 user2
password2
UID2
GID2
GECOS2
directory2
shell2

# ORS : 输出记录的分隔符,输出时用指定符号代替换行符
awk -v FS=':' -v ORS='---' '{print $1,$2}' filename
user1 password1---user2 password2---

# NF : 字段数量,共有多少字段, $NF 引用最后一列,$(NF-1)引用倒数第2列
awk -F: '{print NF}' filename
7
7
## 显示倒数第2列
awk -F: '{print $(NF-1)}' filename
directory1
directory2

# NR : 行号计数,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
awk '{print NR}' filename filename1
1
2
3
4
5
6

# END 是一个特殊的模式,它匹配输入流的末尾,即所有的输入行都已被处理完毕后才执行 END 块中的动作
awk END'{print NR}' filename filename1
6

# FNR : 各文件行号分别计数,后跟一个文件和 NR 一样,跟多个文件,第二个文件行号从1开始
awk '{print FNR}' filename filename1
1
2
1
2
3
4

# FILENAME : 当前文件名
awk '{print FILENAME}' filename
filename

# ARGC : 表示命令行参数的数量(包括 awk 命令本身和所有文件名)
# BEGIN 是一个特殊的模式,用于在处理任何输入行之前执行指定的动作
awk 'BEGIN {print ARGC}' filename filename1
3

# ARGV : 数组,保存的是命令行所给定的各参数,查看参数
# 输出第一个参数
awk 'BEGIN {print ARGV[0]}' filename filename1
awk

# 输出第二个参数
awk 'BEGIN {print ARGV[1]}' filename filename1
filename

# 输出第三个参数
awk 'BEGIN {print ARGV[2]}' filename filename1
filename1

自定义变量

# 先定义变量,后执行动作print
awk -v name="ssssss" -F: '{print name":"$0}' filename
ssssss:user1:password1:UID1:GID1:GECOS1:directory1:shell1
ssssss:user2:password2:UID2:GID2:GECOS2:directory2:shell2
# 在执行动作print后定义变量,第一个记录由于变量还未定义所以不能调用定义的变量
awk -F: '{print name":"$0;name="ssssss"}' filename
:user1:password1:UID1:GID1:GECOS1:directory1:shell1
ssssss:user2:password2:UID2:GID2:GECOS2:directory2:shell2
cat awk.txt
{name="sssss";print name,$1}
# 可以把执行的动作放在脚本中,直接调用脚本 -f
awk -F: -f awk.txt filename
sssss user1
sssss user2

printf 命令

格式化

printf "FORMAT", item1,item2, ...

FORMAT:

awk -F: '{print $1,$3}' /etc/passwd
root 0
bin 1

# 第一列显示小于20的字符串;第2列显示整数并换行,中间用---隔开
awk -F: '{printf "%20s---%u\n",$1,$3}' /etc/passwd
root---0
bin---1

# 使用-进行左对齐;第2列显示浮点数
awk -F: '{printf "%-20s---%-10.3f\n",$1,$3}' /etc/passwd
root                ---0.000    
bin                 ---1.000

# 使用printf做表格
awk -F: 'BEGIN{printf "username            userid\n-----------------------------\n"}{printf "%-20s|%-10.3f\n",$1,$3}' /etc/passwd
username            userid
-----------------------------
root                |0.000    
bin                 |1.000