面试题:
查看ssh连接数最多的前10个
[root@localhost ~]# ss -nt | tail -n+2 | tr -s ' ' : | cut -d: -f6 | sort| uniq -c | sort -nr | head -n10
2 192.168.11.1
比较文件
diff命令(比较文本) => cmp(比较二进制)
一、基本用法
diff
命令的基本用法如下:diff [OPTION]... FILE1 FILE2
二、功能特点
- 逐行比较:
diff
以逐行的方式比较文本文件的异同处。- 支持多种格式:
diff
支持正常(normal)、上下文(context)和合并(unified)三种格式来显示差异。- 目录比较:如果指定比较的是目录,
diff
会比较两个目录下具有相同文件名的文件,但不会比较子目录中的文件。三、常用选项
diff
命令有许多选项,以下是一些常用的选项及其说明:
-c
:显示全部内容,并标出不同之处,以上下文格式(Context Format)显示差异。-u
或-U<列数>
:以合并(unified)的方式来显示文件内容的不同,默认显示差异点前后各3行内容,可以通过<列数>
参数指定行数。-y
或--side-by-side
:以并列的方式显示文件的异同之处。-i
或--ignore-case
:不检查大小写的不同。-b
或--ignore-space-change
:不检查空格字符的不同。-B
或--ignore-blank-lines
:不检查空白行的变化。-w
或--ignore-all-space
:比较时忽略所有空格。-r
或--recursive
:当比较目录时,递归比较所有找到的子目录。-q
或--brief
:仅显示有无差异,不显示详细的信息。-s
或--report-identical-files
:若没有发现任何差异,仍然显示信息。四、输出结果解释
diff
命令的输出结果可能会因所选的格式和选项而异,但通常包含以下几个部分:
- 文件标识:在比较文件时,
diff
会在输出中显示文件的名称和(或)时间戳等信息。- 差异标识:对于不同的差异点,
diff
会使用不同的符号来表示,如c
表示内容改变,a
表示增加,d
表示删除等。- 差异内容:紧接着差异标识,
diff
会显示具体的差异内容,包括被删除的行(前面有<
)、被添加的行(前面有>
)等。五、应用场景
- 软件开发:在软件开发过程中,
diff
命令可以用于比较源代码文件之间的差异,帮助开发者快速定位修改内容。- 版本控制:
diff
命令是版本控制系统(如Git、SVN等)中常用的工具,用于生成差异文件,以便进行代码审查或合并。- 日常文件比较:在日常工作中,
diff
命令也可以用于比较两个文本文件之间的差异,如比较两个配置文件的差异等。总之,
diff
命令是Linux中一个非常强大的工具,通过它可以方便地比较文件或目录之间的差异,并在多种场景下发挥重要作用。
示例:
[root@localhost ~]# diff passwd www
1,47c1,5
< root:x:0:0:root:/root:/bin/bash
< bin:x:1:1:bin:/bin:/sbin/nologin
< daemon:x:2:2:daemon:/sbin:/sbin/nologin
< adm:x:3:4:adm:/var/adm:/sbin/nologin
< lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
< sync:x:5:0:sync:/sbin:/bin/sync[root@localhost ~]# diff -u passwd www
--- passwd 2024-09-07 20:45:56.442140364 -0700
+++ www 2024-09-08 20:44:04.306812745 -0700
@@ -1,47 +1,5 @@
-root:x:0:0:root:/root:/bin/bash
-bin:x:1:1:bin:/bin:/sbin/nologin
-daemon:x:2:2:daemon:/sbin:/sbin/nologin[root@localhost ~]# cmp /usr/bin/ls /usr/bin/pwd
/usr/bin/ls /usr/bin/pwd differ: byte 25, line 1
patch命令
在Linux中,
patch
命令是用来将差异文件(通常是由diff
命令生成的)应用到原文件上,以更新或修改原文件内容的工具。这在软件开发、版本控制、以及任何需要应用变更到文件或代码库的场景中都非常有用。基本用法
patch
命令的基本用法如下:patch [选项] <原始文件> <差异文件>
但是,更常见的做法是直接指定差异文件,并让
patch
命令自动找到并更新相应的文件,特别是当差异文件是以-p
选项(指定剥离路径的层数)和文件名(如patch-file.patch
)的形式给出时。
bash复制代码
patch -p<number> < <差异文件>
这里的
<number>
是一个数字,表示要从差异文件中的文件名中剥离的路径层数。例如,如果差异文件中的引用路径是/home/user/project/src/file.c
,而当前目录是/home/user/project
,则可以使用-p1
来剥离掉最前面的/home/user/project/
路径,使得patch
命令能够找到src/file.c
并对其进行更新。常用选项
-p<number>
:指定从差异文件中的文件名中剥离的路径层数。-R
或--reverse
:应用差异的反向补丁,即撤销差异。-i <文件>
:从指定文件中读取差异,而不是从标准输入读取。这允许你在命令行中直接指定差异文件。-s
或--silent
或--quiet
:在成功应用补丁时不显示任何输出。-b
或--backup
:在修改文件之前备份原文件,备份文件通常会在原文件名后加上一个~
后缀。-N
或--forward
:假设新文件在补丁中创建的文件确实存在,并尝试应用补丁。
正则表达式
正则表达式分类
1.基本正则表达式:BRE
2.扩展正则表达式:ERE
正则表达式引擎:
采用不同算法,检查正则表达式的软件模块,如:PCRE
正则表达式元字符分类:字符匹配,匹配次数,位置锚定,分组
帮助:man 7 regex
基本正则表达式元字符
字符匹配
. 匹配单个字符
[ ] 匹配指定范围内的单个字符,示例:[wtj]
[^ ] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符
[:lower:] 小写字母示例:[[:lower:]] <=>[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印字符的控制字符(退格,删除,警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
匹配次数
* 匹配前面字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0次或1次
\+ 匹配其前面的的字符至少一次,即肯定有
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面字符至少m次至多n次
\{,n\} 匹配前面的字符之多n次
\{m,\} 匹配前面的字符至少m次
范例:
[root@localhost ~]# echo /etc/ | grep "/etc/\?"
/etc/
[root@localhost ~]# echo /etc | grep "/etc/\?"
/etc
位置锚定
位置锚定可用于定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于匹配整个行
^$ 空行
^[[:space:]]$ 空白行
\< 或 \b 词首锚定用于单词模式的左侧
\> 或 \b 词尾锚定用于单词模式的右侧
\<PATTERN\> 匹配整个单词
示例:过滤空行和井号开头的行
[root@localhost ~]# cat /etc/profile | grep -v ^# | grep -v ^$
示例:
[root@localhost ~]# df | grep /dev/sd | grep -o " *[0-9]\{1,3\}%"
20%
52%
分组其他
分组:()将一个或多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
分组括号中的模式匹配到内容会被正则表达式引擎记录于内部变量中,这些变量命名方式为
\1,\2,\3...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配的字符.
示例:
\(string1\(string2\)\)
\1 : string1\(string2\)
\2 : string2
向后引用 :引用前面的分组括号中的模式所匹配的字符,而非模式本身
或者:\|
示例:
a\|b a或者b
\(C\|c\)at Cat或cat
扩展正则表达式
字符匹配
. 匹配单个字符
[ ] 匹配指定范围内的单个字符,示例:[wtj]
[^ ] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符
[:lower:] 小写字母示例:[[:lower:]] <=>[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印字符的控制字符(退格,删除,警铃...)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
匹配次数
* 匹配前面字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
? 匹配其前面的字符0次或1次
+ 匹配其前面的的字符至少一次,即肯定有
{n} 匹配前面的字符n次
{m,n} 匹配前面字符至少m次至多n次
{,n} 匹配前面的字符之多n次
{m,} 匹配前面的字符至少m次
位置锚定
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于匹配整个行
^$ 空行
^[[:space:]]$ 空白行
\< 或 \b 词首锚定用于单词模式的左侧
\> 或 \b 词尾锚定用于单词模式的右侧
\<PATTERN\> 匹配整个单词
分组其他
() 分组
向后引用:\1,\2...
| 或者
a|b a或者b
(C|c)at Cat或cat
文本处理三剑客grep
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到行
模式:由正则表达式字符及文本字符所编写的过滤条件
格式:
grep [OPTION] PATTERN [FILE...]
常见选项:
--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 不显示被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after,后#行
-B # before,前#行
-C # context,前后各#行
-e 实现多个选项逻辑的 or 关系
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式
-f file 根据模式文件处理
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
范例:
[root@localhost ~]# grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -c root passwd
2
[root@localhost ~]# grep -cv root passwd
45[root@localhost ~]# grep -m 1 root passwd
root:x:0:0:root:/root:/bin/bash[root@localhost ~]# grep -i ROOT passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin[root@localhost ~]# grep -nA 2 root passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
范例:查看分区利用率最高的分区
[root@localhost ~]# df | grep /dev/sd | tr -s ' ' %| cut -d% -f5 | sort -nr | head -n1
52
[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 457464 0 457464 0% /dev
tmpfs 497848 4 497844 1% /dev/shm
tmpfs 497848 14404 483444 3% /run
tmpfs 497848 0 497848 0% /sys/fs/cgroup
/dev/sda3 22748312 4350220 18398092 20% /
/dev/sda1 303780 155540 148240 52% /boot
tmpfs 99572 0 99572 0% /run/user/0