LINUX操作(grep_seed_awk)

bash命令常用功能

字符处理

1
2
3
4
5
6
7
8
9
10
11
12
13
# 批量前缀指定
ni9ne@ni9nes:~$ echo naxx{111,123,1112}
naxx111 naxx123 naxx1112
# 连续补全后缀
ni9ne@ni9nes:~$ echo naxx{1..10}
naxx1 naxx2 naxx3 naxx4 naxx5 naxx6 naxx7 naxx8 naxx9 naxx10
# 指定步长补全后缀
ni9ne@ni9nes:~$ echo naxx{1..10..2}
naxx1 naxx3 naxx5 naxx7 naxx9
# 指定格式补全后缀
ni9ne@ni9nes:~$ echo naxx{001..10..2}
naxx001 naxx003 naxx005 naxx007 naxx009

命令行快捷键

1
2
3
4
5
Ctrl + a  移动光标到命令首字符
Ctrl + e 移动光标到命令末尾字符
Ctrl + u 删除光标之前的字符
Ctrl + k 删除光标之后的字符
Ctrl + l 清屏,相当于命令clear

正则表达式

regular expression - REGEXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
基本正则表达式 BRE  Basic Regular Expression
- 包括字符:
^ - 匹配以指定字符开头, 如 "^nax" 表示匹配以'nax'开头的行
$ - 匹配以指定字符结尾, 如 "axx$" 表示匹配以'axx'结尾的行
. - 匹配任意一个字符
[] - 匹配中括号内任意一个字符, 如 "[abc]" 表示匹配a或b或c
* - 匹配前一个字符出现任意次,0次或多次
[^abc] - 匹配除了^后出现的任意字符, ^在中括号内代表取反
扩展正则表达式 ERE Extended Regular Expression
扩展正则需要用grep -E 搭配才能使用
- 包括字符:
() - 分组过滤,将括号内的字符当做一个整体,如"g(oo|la)d"代表good或glad
后可以使用\n 引用第n个括号内内容
{} - 匹配前一个字符指定次数
{n,m} - 最少n次,最大m次
{n,} - 最少n次
{,m} - 最多m次
{n} - 正好n次
? - 匹配前一个字符0次或一次
+ - 匹配前一个字符一次或多次
| 或者,同时过滤多个字符串

主要用于处理大量字符串, 过滤替换处理

linux工具

grep - 文本过滤工具

sed - 流编辑器

awk - 格式化文本报告生成器

grep

global search regular expression and print out the line

文本搜索工具, 根据用户指定的模式逐行匹配目标文本, 打印匹配的行

1
2
3
4
5
6
7
8
9
10
grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE.
Example: grep -i 'hello world' menu.h main.c
-i --ignore-case 忽略字符大小写
-o --only-matching 仅显示匹配到的字符串本身而不是整行
-v --invert-match 显示未被匹配到的行
-E --extended-regexp 支持扩展正则
-q --quiet 不输出任何匹配信息
-n 显示行号
-c 仅统计匹配行数
1
2
3
4
# 排除所有空行
grep '^$' passwd.txt -v
# 排除所有空行和注释行
grep '^$' passwd.txt -v | grep '^#' passwd.txt -v

sed

Stream Editor 字符流编辑器

用于操作、过滤、转换文本内容的工具, 常用于过滤指定字符串, 取出指定行数据等

image-20220421235311504

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
选项 内置命令字符 输入文件
选项参数:
-n 取消默认输出(默认输出全部,包括未匹配与匹配到的行), 一般与命令字符p一起用
-i 将修改结果写入文件,不用-i是修改sed内存数据
-e 多次编辑,免用管道符
-r 支持扩展正则模式
内置命令字符参数:
a append,追加文本,在指定行后添加文本内容
i insert,插入文本,在指定行之前插入文本内容
d delete,删除匹配文本行
p print,打印匹配行内容,通常与选项-n一起使用
s/匹配正则/替换内容/g 匹配内容并替换(支持正则),g代表全局替换
匹配范围参数:
空地址 全文处理
单地址 指定文件某一行
/pattern/ 匹配到的每一行
范围区间 10,20 - 10到20行全部 | 10,+5 - 从第十行起向下5步 | /pattern1/,/pattern2/
步长 1~2 - 从一开始,两步一跳,即1,3,5,7... | 2~2 - 从二开始,两步一跳,即2,4,6,...
案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 输出测试文件第2,3行内容
sed -n '2,4p' passwd.txt # 取消默认输出,仅打印2到4行
# 过滤出含有ni9ne字符串的行
sed -n '/ni9ne/p' passwd.txt
# 删除含有root的行
sed '/root/d' passwd.txt # 仅显示删除后文本的剩余内容
sed -i '/root/d' passwd.txt # 加-i参数后直接修改文件,无回显
# 替换文件中的ni9ne为user09
sed -i 's/ni9ne/user09/g' passwd.txt # 无回显
# 替换文件中的ni9ne为user09,同时替换root为naxx
sed -i -e 's/ni9ne/user09/g' -e 's/root/naxx/g'passwd.txt
# 在文件第二行追加字符 game:x:1000:33:game:/home/game:/bin/bash
sed -i '2a game:x:1000:33:game:/home/game:/bin/bash' passwd.txt
# 在文件首行插入多行字符
sed -i '1i root1 \n root2' passwd.txt # 多行数据用\n隔开即可
# 在每行文本下添加分隔符 ----
sed -i 'a -----------' passwd.txt # 空地址代表全文处理
# 为前五行数据添加分隔符---
sed -i '1,5a ------' passwd.txt

使用sed取出linux的IP地址

1
2
3
ifconfig ens33 | sed -n '2p' | sed 's/^.*inet //' | sed 's/ netmask.*$//'
或者
ifconfig ens33 | sed -n -e '2s/^.*inet //' -e '2s/ netmask.*$//p'

awk

拥有强大的文本格式化能力, 可以将文本数据格式化成对应格式输出或显示

1
2
3
4
5
6
awk [option] 'pattern[action]' file ...
选项 模式/动作条件 文件
如: awk '{print $2}' passwd.txt #表示打印以空格分隔符的第二行数据
- awk中默认以空格作为分隔符, 且多个空格识别为单个空格
- awk默认按行处理文件
- $0代表所有行, $n代表第n列数据, $NF代表最后一列,倒数第二列可以写为$(NF-1)
1
2
3
4
awk选项参数
-F 指定字段分隔符
-v 定义或修改awk内部变量
-f 从脚本文件中读取awk命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
awk内置变量
- $n 指定分隔符分隔的第n列
- $0 所有列,完整的列数据
- FS(field_separator) 字段分隔符, 默认为空格
- NF(number_of_fields) 分隔后的字段总个数
- NR(number_of_records) 记录行总行数
- RS(record_separator) 记录行分隔符, 默认为换行符
- OFS(output_field_separator) 输出字段分隔符, 默认为空格
- ORS(output_record_separator) 输出记录行分隔符, 默认为换行符
- FNR 各文件分别计数行号
- FILENAME 当前处理文件名
- ARGC 命令行参数个数
- ARGV 数组,保存命令行给定参数
awk自定义变量

自定义输出内容时, 必须外层单引号, 内层双引号, 变量$1,$2 不可以添加双引号, 否则会识别为文本

案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 输出整行信息
awk '{print}' passwd.txt
awk '{print $0}' passwd.txt
# 输出第1,2列和倒数第二列数据
awk '{print $1,"------",$2,"------",$(NF-1)}' passwd.txt
# 输出文件第五行数据
awk 'NR==5' passwd.txt # =是给变量赋值, ==表示判断符
# 输出文件第二到第五行数据
awk 'NR==2,NR==5' passwd.txt
# 输出第2行和第五行的内容
awk 'NR==2||NR==5{print $0}' passwd.txt
# 输出第二到第五行的第1,2列数据
awk 'NR==2,NR==5{print $1,$2}' passwd.txt
# 输出所有数据并添加行号
awk '{print NR,$0}' passwd.txt
# 输出以:分隔的passwd文件为以----或制表符为分隔符
awk -F ":" -v OFS="----" '{print $1,$NF}' passwd.txt
awk -v FS=":" -v OFS="\t" '{print $1,$NF}' passwd.txt
# 处理多个文件显示行号
awk '{print FNR,$0}' passwd.txt spasswd.txt

使用awk取出IP地址

1
ifconfig ens33 | awk 'NR==2{print $2}'