Linux三剑客
grep
grep
是一个非常强大的文本搜索工具,它使用正则表达式来搜索文本,并将匹配的行打印到标准输出。grep
全称是 "Global Regular Expression Print",它用于在文件或输出中搜索包含指定模式的行,支持多种正则表达式语法,提供灵活的搜索能力。
常用命令:
-
搜索字符串:
grep "search_string" filename
在文件
filename
中搜索包含search_string
的文本行。 -
忽略大小写搜索:
grep -i "search_string" filename
使用
-i
选项执行不区分大小写的搜索。 -
输出行号:
grep -n "search_string" filename
使用
-n
选项在输出中包含行号。 -
统计匹配行的数量:
grep -c "search_string" filename
使用
-c
选项统计匹配的行数。 -
显示不包含指定模式的行:
grep -v "search_string" filename
使用
-v
选项反转搜索,显示不匹配的行。 -
搜索多个文件:
grep "search_string" file1 file2
搜索多个文件,查找包含
search_string
的行。 -
递归搜索:
grep -r "search_string" directory/
使用
-r
选项在目录directory
及其子目录下的所有文件中递归搜索。 -
输出匹配字符串前后的行:
grep -B num -A num "search_string" filename
使用
-B
(before) 和-A
(after) 选项输出匹配行前后的num
行。 -
正则表达式搜索:
grep -E "regex_pattern" filename
使用
-E
选项执行扩展的正则表达式搜索。 -
匹配多个模式:
grep -e "pattern1" -e "pattern2" filename
使用
-e
选项可以指定多个匹配模式。
awk
awk
是一种编程语言,专门设计用于文本处理和数据抽取,awk
以行为处理单位,可以对每一行进行模式匹配并执行相应的动作,awk
程序的基本结构是 'pattern {action}'
,其中 pattern
是用于匹配行的模式,action
是对匹配行执行的命令。
常用命令:
-
打印文件内容:
awk '{print}' filename
打印文件
filename
的所有内容,等同于cat
命令。 -
打印特定列:
awk '{print $1, $3}' filename
打印文件
filename
中的第一列
和第三列
的内容。 -
指定分隔符分割列:
awk -F',' '{print $1, $2}' filename
使用
-F
选项指定逗号为字段分隔符,然后打印第一列
和第二列
。 -
模式匹配:
awk '/pattern/ {print $0}' filename
只打印包含
pattern
的行。 -
条件语句:
awk '$1 > 100 {print $0}' filename
如果第一列的值大于
100
,则打印整行。 -
多个命令:
awk '{print $1; print $2}' filename
对每一行打印
第一列
后,再打印第二列
。 -
内置变量:
awk 'BEGIN {FS=","; OFS=" - "} {print $1, $2}' filename
BEGIN
块设置字段分隔符FS
和输出字段分隔符OFS
,然后打印用 " - " 分隔的第一列和第二列。 -
模式匹配和计算:
awk '/pattern/ {count++} END {print count}' filename
计算匹配
pattern
的行数并在结束时打印。 -
范围模式:
awk '/start_pattern/,/end_pattern/' filename
打印从匹配
start_pattern
到匹配end_pattern
之间的所有行。 -
脚本文件:
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
自定义变量
-v var=value
# 先定义变量,后执行动作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
- 在
program
中直接定义
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
-
不自动换行,需要显式给出换行控制符,
\n
-
FORMAT
中需要分别为后面每个item
指定格式符
FORMAT:
-
格式符,与 item 一一对应
%c
: 显示字符的 ASCII 码%d
,%i
: 显示十进制整数%e
,%E
: 显示科学计数法数值%f
:显示为浮点数,小数%5.1f
,带整数、小数点、整数共5位,小数1位,不够用空格补上%g
,%G
:以科学计数法或浮点形式显示数值%s
:显示字符串;例:%5s
最少5个字符,不够用空格补上,超过5个还继续显示%u
:无符号整数%%
: 显示%
自身
-
修饰符:放在
%c[/d/e/f...]
之间#[.#]
:第一个数字控制显示的宽度;第二个#
表示小数点后精度,%5.1f
-
:左对齐(默认右对齐)%-15s
+
:显示数值的正负符号%+d
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