grep配合正则表达式可以灵活的查找文本内容。
但是有些时候我们不仅仅需要找出数据,还需要按照一定的规则进行整合,格式化排列
文本文件内有一百条规范数据,如下:
John Doe, 25, Engineer
Alice Smith, 30, Data Scientist
Bob Johnson, 22, Intern
Charlie Brown, 35, Manager
...
想要查找某条数据,或者符合条件的数据可以使用grep+正则,找出符合条件的行。
grep
grep -E '*John ' data.txt
用于查找名字首个单词时John的行
然而此时找出的数据,仍然是整行为单位,我们想把姓名,年龄,职业区分开或者对他们做什么处理时,grep就不够用了;这时候我们可以使用awk。
awk
awk -F ', ' '$2>30 { printf "名字: %s, 年龄: %d, 职业: %s \n", $1, $2, $3}' data.txt
-F 接受字符串作为分割符,也可以是正则表达式
pattern{内置语句 }实现对文本项匹配和对分割后的元素进行处理
sed
主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
... | sed 's/职业: /job: /'
's/old/new/'
用新内容代替传入的旧内容
组合:找出文件中大于25岁的人,将他们的信息格式化显示
#!/bin/bash
INPUT_FILE="data.txt"
echo "---------------年龄大于25岁的人---------------"
grep -E ', [2][6-9]|, [3-9][0-9]' "$INPUT_FILE" | \
awk -F ', ' '{ printf "名字: %s, 年龄: %d, 职业: %s \n", $1, $2, $3}' | \
sed 's/职业: /job: /'[2][6-9]|, [3-9][0-9]' 表示匹配包含26-29或30-99的行
grep:
过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用
-E 扩展正则表达式
awk:
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:,默认的分隔符是连续的空格或制表符
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令sed:
options:可选参数,用于控制 sed 的行为。
command:要执行的命令,通常是替换、删除等。
file:输入的文本文件。