shell
1.awk
1.1原理
-
扫描输入文件:
Awk 从输入文件逐行读取数据,每行作为一个记录,逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。可以通过指定的字段分隔符将每行分割成多个字段。 -
模式匹配:
对于每一行记录,Awk 可以执行指定的模式匹配操作,以确定是否应用相应的操作。模式可以是正则表达式、条件判断或特定的行号等。 -
执行操作:
当某行满足模式匹配条件时,Awk 执行指定的操作。操作可以是输出、计算、字符串处理、变量赋值等,以对数据进行处理。 -
输出结果:
根据执行的操作,Awk 可以生成输出结果。输出可以是打印到标准输出、格式化输出、写入文件等。
1.2 常见的内建变量
变量名称 | 描述 |
---|---|
FS | 指定每行文本的字段分隔符,默认为空格或制表位。 |
NF | 当前处理的行的字段个数。 |
NR | 当前处理的行的行号(序数)。 |
$0 | 当前处理的行的整行内容。 |
$n | 当前处理行的第 n 个字段(第 n 列)。 |
FILENAME | 被处理的文件名。 |
RS | “行“分割符,AWK 从文件上读取资料时,将根据 RS 的定义把资料切割成许多条记录;AWK 一次仅读入一条记录,以进行处理,预设值是 \n。 |
1.3 实例
现在有个文件file.txt
John Doe 25 55
Jane Smith 30
Adam Johnson 28
awk '{print NF}' file.txt #打印当前行的字段数,空格隔开的数据,这里的结果是
4
3
3
awk '{print NR}' file.txt #打印当前行的行号,这里的结果是
1
2
3
awk '(NR>=2)&&(NR<=4)' file.txt #打印第2--4行,注意print可以省略
awk '(NR==2)||(NR==4){print}' file.txt #打印第2行和第4行
awk '(NR%2)==1{print}' file.txt #打印奇数行
awk '{print $0}' file.txt # 打印当前行的所有字段,这里的结果是
John Doe 25 55
Jane Smith 30
Adam Johnson 28
awk '{print $2}' file.txt # 打印当前行的第2列数据,这里的结果是
Doe
Smith
Johnson
awk 'BEGIN {FS = "," } {print $2 $3}' file.txt #这里不在以默认的空格为分割符,而是以“,”为分隔符,然后打印文件每一行的第2列,第3列
awk '/^a/{print}' file.txt #打印以a开头的所有行 /***/ 表示***是一个正则表达式
awk '/hello$/{print}' file.txt #打印以hello结尾的所有行
awk -F ":" {print $4} file.txt #以:为分隔符,打印文件第四个字段
2.grep
2.1 原理
grep 是一个常用的命令行工具,用于在文本文件中搜索指定的字符串模式。它的原理是基于正则表达式进行匹配搜索。以下是 grep 的基本原理和工作流程:
接收输入:
grep 接收用户指定的字符串模式(可以是简单字符串,也可以是正则表达式)以及要搜索的文件名或者从标准输入读取的文本流。
解析模式:
grep 解析用户提供的字符串模式,如果模式包含正则表达式元字符(如 .、*、[ ] 等),则根据正则表达式的语法解释其含义。
搜索匹配:
grep 逐行遍历输入文本,对每一行应用用户提供的模式进行匹配。当匹配成功时,grep 将该行输出到标准输出(或者根据用户的指定,可以输出匹配的行号、文件名等信息)。
输出结果:
grep 将匹配成功的行输出到标准输出,供用户查看。用户可以根据需要将结果保存到文件或者进行进一步的处理。
可选参数处理:
grep 还支持许多可选参数,例如 -i(忽略大小写)、-v(反向匹配)、-l(仅显示包含匹配的文件名)、-c(仅显示匹配行数)、-r(递归搜索目录)等。这些参数可以根据用户的需要来调整搜索行为。
总之,grep 的原理是基于用户提供的字符串模式,在输入文本中搜索匹配的行,并将结果输出到标准输出,帮助用户快速定位所需信息
2.2 参数说明
参数 | 说明 |
---|---|
-i | 忽略大小写,即不区分大小写地匹配模式。 |
-v | 反向匹配,只输出不匹配模式的行。 |
-c | 只输出匹配的行数,而不是匹配的内容。 |
-l | 仅列出包含匹配模式的文件名,而不显示匹配的行。 |
-n | 在输出的每一行前加上匹配的行号。 |
-r 或 -R | 递归地搜索目录中的文件。 |
-w | 匹配整个单词,而不是部分匹配。 |
-A <num> | 显示匹配行及其后 <num> 行的内容。 |
-B <num> | 显示匹配行及其前 <num> 行的内容。 |
-C <num> 或 -<num> | 显示匹配行及其前后各 <num> 行的内容。 |
--exclude=<pattern> | 排除符合 <pattern> 模式的文件或目录。 |
--include=<pattern> | 仅搜索符合 <pattern> 模式的文件或目录。 |
--exclude-dir=<pattern> | 排除符合 <pattern> 模式的目录。 |
--color=<when> | 在匹配的部分上着色显示。<when> 可以是 always 、never 或 auto 。 |
-E 或 --extended-regexp | 使用扩展的正则表达式语法进行匹配。 |
-F 或 --fixed-strings | 将模式视为固定字符串而不是正则表达式。 |
-m <num> | 仅匹配 <num> 个行后停止搜索。 |
2.3 实例
文件example.txt内容
This is an example file.
It contains some lines of text.
We will use grep to demonstrate various options.
#使用 -A 选项显示匹配行及其后两行的内容
grep -A 2 "example" example.txt
#使用 -B 选项显示匹配行及其前两行的内容
grep -B 2 "example" example.txt
#使用 -v 选项反向匹配,显示不包含匹配字符串的行:
grep -v "example" example.txt
#使用 -E 选项启用扩展的正则表达式匹配:
grep -E "file|text" example.txt
输出内容
This is an example file.
It contains some lines of text.
#使用 -F 选项将模式视为固定字符串而不是正则表达式:
-F 选项表示将模式视为固定字符串而不是正则表达式。这对于
那些包含正则表达式元字符的模式可能会更有用,因为它们将被
视为普通字符,而不是元字符。
grep -F "example" example.txt
3.sed
##3.1 原理
sed
是一种流编辑器,用于对文本进行编辑、替换和转换。其名称来源于流编辑器(stream editor)
的缩写。sed 主要用于处理文本流,并根据提供的指令进行编辑操作。以下是 sed 的基本原理:
接收输入:
sed 从标准输入、文件或管道中接收文本输入。它可以接受来自其他命令输出的文本流作为输入。
处理文本流:
sed 将输入文本按行读入,并在内存中存储为文本流的形式。它逐行处理输入,并对每一行应用用户指定的编辑操作。
应用编辑指令:
sed 根据用户提供的编辑指令(命令)来修改文本。这些指令可以是对单行操作,也可以是针对整个文本的操作。常见的编辑指令包括替换、删除、添加、移动等。
输出结果:
sed 在处理完所有编辑指令后,将编辑后的文本流输出到标准输出,用户可以选择将输出保存到文件或者通过管道传递给其他命令。
重复处理:
如果用户提供了多个编辑指令,sed 将逐个应用这些指令,并重复处理整个文本流,直到处理完所有指令。
3.1 常用使用方法
#在 input.txt 中将所有匹配的 old_pattern 替换为 new_pattern
sed 's/old_pattern/new_pattern/g' input.txt
# 只替换每行的第一个 "old_word"
sed 's/old_pattern/new_pattern/' input.txt
#删除 input.txt 中包含匹配 pattern 的行
sed '/pattern/d' input.txt
sed '1i This is the first line' input.txt # 在第一行前插入文本
sed '$a This is the last line' input.txt # 在最后一行追加文本
sed '5i New line' input.txt # 在第5行前插入 "New line"
sed -n '/pattern/=' input.txt # 显示包含 "pattern" 的行的行号
#在原始文件中直接修改,可以使用 -i 选项。这将直接修改输入文件
sed -i 's/old_pattern/new_pattern/g' input.txt
# 替换包含 "pattern1" 的行中的 "word1" 为 "WORD1"
sed '/pattern1/s/word1/WORD1/g' input.txt
# 在第3行后追加 "New line",仅当第3行包含 "pattern"
sed '/pattern/{n; a\New line}' input.txt
#替换grep搜索结果的hel 为hello,在原文件中修改
grep "pattern" input.txt | sed -i 's/hel/hello/g'
4、lsof
lsof
是一个在 Unix 和类 Unix 系统中用于列出打开文件的工具,它的名字代表 “list open files”。
lsof 可以列出当前系统中所有被打开的文件,包括普通文件、目录、管道、网络连接、设备文件等
,还可以显示这些文件被哪些进程使用。
4.1原理:
lsof 命令通过读取系统的 /proc 目录和内核数据结构来获取有关打开文件的信息。它提供了一种查看系统资源使用情况的方式,能够展示哪些进程打开了哪些文件、网络连接等信息
。
基本用法:
lsof 命令的基本用法格式为:
lsof [options]
可以直接运行 lsof 命令来列出当前系统中所有打开的文件和相关信息。
4.2 常用选项
以下是一些常用的 lsof 命令选项:
-i:显示所有网络连接信息。
-c <进程名>:仅显示指定进程打开的文件。
-u <用户名>:仅显示指定用户打开的文件。
-p <进程号>:仅显示指定进程号打开的文件。
-t:仅显示进程号(PID)而不显示其他信息。
-a:同时显示多个条件(与关系)。
-i4:仅显示 IPv4 协议的网络连接信息。
-i6:仅显示 IPv6 协议的网络连接信息。
4.3 常用方法
lsof -c nginx #列出指定进程打开的文件
lsof -u username #列出指定用户打开的文件
lsof /path/to/file #列出指定文件名的打开情况
lsof -i :port_number #列出指定端口的网络连接信息
lsof -p PID #列出指定进程号的打开文件
lsof -i4 # 仅显示 IPv4 网络连接
lsof -i6 # 仅显示 IPv6 网络连接
4.4 结果展示
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1234 user cwd DIR 253,1 4096 123 /home/user
firefox 5678 user mem REG 253,1 1944400 456 /usr/lib/firefox/firefox
sshd 9876 root 3u IPv4 7890 0t0 TCP *:ssh (LISTEN)
Column | Description |
---|---|
COMMAND | 显示正在使用文件的进程的名称。 |
PID | 显示进程的标识符(Process ID),即进程的 PID。 |
USER | 显示运行进程的用户名。 |
FD | 显示进程正在使用的文件描述符(File Descriptor)。可能的值包括: |
cwd :当前工作目录(Current Working Directory)。 | |
txt :程序的代码(text)段。 | |
mem :进程正在使用的内存映射文件。 | |
0-9 :进程打开的文件描述符(例如 1 表示标准输出,2 表示标准错误)。 | |
IPv4 或 IPv6 :网络连接(如 TCP 或 UDP)。 | |
TYPE | 显示打开文件的类型。可能的类型包括: |
REG :常规文件。 | |
DIR :目录。 | |
CHR :字符设备。 | |
BLK :块设备。 | |
FIFO :命名管道(FIFO)。 | |
SOCK :套接字(Socket)。 | |
UNKNOWN :未知类型的文件。 | |
DEVICE | 显示文件所在的设备名称。 |
SIZE/OFF | 显示文件的大小或偏移量。 |
NODE | 显示文件的节点号(inode number)。 |
NAME | 显示文件的完整路径或网络连接的地址和端口号。 |
5、ss
ss 命令是一个用于显示套接字统计信息的工具
,它可以用来替代旧的 netstat 命令。ss 是 Linux 系统上的一款网络工具,用于获取套接字(socket)统计信息,包括 TCP 连接状态、UDP 连接状态、监听的套接字等等
。
5.1 原理
ss 命令的原理涉及到它是如何获取套接字信息的。在 Linux 系统中,套接字(socket)是应用程序与网络之间的接口,用于网络通信。ss 命令通过读取系统内核中的套接字信息来获取网络状态。它主要利用了 /proc/net 文件系统中的信息和系统调用来实现。
5.2 常用选项
-t: 显示 TCP 套接字信息。
-u: 显示 UDP 套接字信息。
-l: 仅显示监听的套接字。
-a: 显示所有套接字(包括监听和非监听状态)。
-n: 显示数字形式的 IP 地址和端口号。
-p: 显示进程信息,包括 PID 和进程名。
-s: 按照套接字状态进行汇总统计。
-4 或 -6: 仅显示 IPv4 或 IPv6 套接字。
6、ps
ps 命令是用于查看系统中正在运行的进程信息的工具,它提供了多种选项和参数来满足不同的需求
6.1 常用选项
常用选项:
-e:显示所有进程,包括没有控制终端的进程。
-f:显示详细的进程信息,包括 UID、PID、PPID、C、STIME 等。
-u userlist:显示指定用户(userlist)的进程信息。
-a:显示除控制终端的进程之外的所有进程。
-x:显示没有控制终端的进程。
进程状态:
ps 命令可以通过进程状态来过滤显示的进程,常见的进程状态包括:
R:运行中或可运行状态。
S:休眠状态。
D:不可中断的休眠状态。
Z:僵尸进程。
T:停止或跟踪状态。
I:空闲内存。
进程信息显示:
ps aux:显示所有用户的所有进程信息。
ps -ef:显示所有进程的详细信息,包括进程的所有者、PID、PPID 等。
ps -u username:显示指定用户(username)的进程信息。
ps -p pid:显示指定进程PID(pid)的信息。
6.2 常用方法
ps aux #查看所有进程
ps -u username #按用户过滤进程
ps f #显示进程树
ps -p pid #按进程PID显示信息
ps -p pid -f #查看特定进程的详细信息
7、htop
htop 是一个交互式的进程查看工具,可以在终端中以更友好的方式显示系统中运行的进程信息,并允许用户对进程进行管理和操作
7.1 常用方法
界面说明:
htop 的界面分为多个部分,主要包括:
顶部显示了系统整体的 CPU、内存和交换空间的使用情况。
中间的进程列表显示了所有运行的进程,包括进程的 PID、用户、CPU 使用率、内存占用等信息。
底部显示了快捷键说明,列出了可以在 htop 中使用的各种操作按键。
常用操作按键:
↑ 和 ↓:上下移动光标选择进程。
Enter:查看选中进程的详细信息。
F6:按照特定的标准对进程进行排序,如按照 CPU 使用率、内存占用等排序。
F2:进入设置界面,可以对 htop 的显示选项进行配置。
k 或 F9:杀死选中的进程。
u:显示或隐藏特定用户的进程。
Space:标记/取消标记进程,用于批量操作进程。
q:退出 htop。
进程操作:
在 htop 中可以对进程进行操作,如终止进程、调整优先级等。通过快捷键 k 或 F9 可以选择要终止的进程,然后按下 Enter 确认终止。
进程查看和过滤:
htop 允许根据不同的需求查看和过滤进程。通过快捷键 F4 可以输入关键字对进程进行过滤,只显示匹配的进程。
系统资源查看:
htop 提供了实时的系统资源使用情况,包括 CPU 使用率、内存占用、交换空间使用等,以直观的图形方式展示,帮助用户监控系统性能。
8、sort
sort 命令是用于对文本文件的内容进行排序的常用命令。它可以按照指定的字段、行或者整体内容来对文件进行排序,并输出排序后的结果。sort 命令通常与管道符 | 结合使用,可以将其输出作为其他命令的输入,从而实现更复杂的文本处理任务
8.1 命令格式
sort [options] [file]
8.2 常用选项
sort 命令支持多种选项,用于控制排序的方式和输出格式。常用的选项包括:
-r, --reverse:以逆序(降序)的方式进行排序。
-n, --numeric-sort:按照数值大小进行排序(而不是按照字典顺序)。
-k , --key=:按照指定的列(key)进行排序,格式为 [,],例如 -k 2,2 表示按照第二列进行排序。
-t , --field-separator=:指定字段的分隔符,默认情况下以空白字符(空格或制表符)作为分隔符。
-u, --unique:仅显示唯一的行(去重)。
-f, --ignore-case:忽略大小写进行排序。
-g, --general-numeric-sort:类似 -n,但是支持科学计数法和十六进制。
-h, --human-numeric-sort:按照人类可读的数字格式进行排序,如 1K、2G 等。
9.uniq
uniq 命令用于从已排序的文本数据中去除重复的行,并可选地统计重复行的数量。它通常与 sort 命令结合使用,用于处理排序后的数据,去除重复行或进行简单的行统计。
9.1 命令格式
uniq [options] [input_file [output_file]]
9.2 常用选项
-d, --repeated:仅显示重复的行(即出现多次的行)。
-c, --count:在输出中显示每行重复出现的次数,并在行前面加上计数。
-i, --ignore-case:忽略大小写进行比较。
-f , --skip-fields=:忽略前面 个字段后再进行比较。
-s , --skip-chars=:忽略前面 个字符后再进行比较。
-w , --check-chars=:指定比较时使用的字符数。