shell学习

本文介绍了Shell编程中的几种常用工具,如文本处理awk(包括内建变量和实例)、grep(原理、参数及实例)、sed(编辑文本的方法)、lsof(列出打开文件)、ss(套接字统计)、ps(进程管理)、htop(交互式进程查看)、sort(排序命令)和uniq(去重计数)。每个工具都详细讲解了其原理和使用实例,有助于理解并实际操作。
摘要由CSDN通过智能技术生成

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> 可以是 alwaysneverauto
-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)

ColumnDescription
COMMAND显示正在使用文件的进程的名称。
PID显示进程的标识符(Process ID),即进程的 PID。
USER显示运行进程的用户名。
FD显示进程正在使用的文件描述符(File Descriptor)。可能的值包括:
cwd:当前工作目录(Current Working Directory)。
txt:程序的代码(text)段。
mem:进程正在使用的内存映射文件。
0-9:进程打开的文件描述符(例如 1 表示标准输出,2 表示标准错误)。
IPv4IPv6:网络连接(如 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=:指定比较时使用的字符数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写一封情书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值