常用命令
sort命令
sort命令将输入的文件内容按照规则排序,然后输出结果
用法: sort 选项]...[文件].
或:soェt[选项]... -- files0-from=F
串联排序所有指定文件并将结果写到标准输出。
-b, ignore- leading- blanks 忽略前导的空白区域
-n, numeric-sort 根据字符串数值比较
-r, reverse 逆序输出排序结果
-u, unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果
-t, --fied- separator=分隔符 使用指定的分隔符代替非空格到空格的转换
-k,-key=位置1 [t,位置2] 在位置1开始一个key,在位置2终止(默认为行尾)
sort -n sort.txt | 对文件安数字排序 |
---|---|
sort -nr sort.txt | 从大到小排序 |
sort -u sort.txt | 去重排序 |
sort -n -t "." -k 4 ip.txt | 按IP末尾排序 |
uniq命令
uniq命令可以输出或者忽略文件中的重复行,常与sort排序结合使用
用法:uniq[选项]...[文件]
从输入文件或者标准输入中筛选相邻的匹配行并写入到输出文件或标准输出。
不附加任何选项时匹配行将在首次出现处被合并。
-c, count 在每行前加上表示相应行目出现次数的前缀编号
-d, repeated 只输出重复的行
-u, unique 只显示出现过一次的行,注意了,uniq的只出现过一次,是针对-c统计之后的结果
uniq luffy.txt | 去重(只去连续的重复) |
---|---|
sort -n luffy.txt | uniq | 排序后去重 |
sort -n luffy.txt | uniq -c | 排序后去重 并统计次数 |
sort -n luffy.txt | uniq -d -c | 排序后去重 并统计重复的行 |
sort -n luffy.txt | uniq -c -u | 显示只出现一次的行 |
wc命令
Wc命令用于统计文件的行数、单词、字节数
-c,-- bytes 打印字节数
-m,-- chars 打印字符数
-1,--1ines 打印行数
-L,--max-1ine- length打印最长行的长度
-w,-- words 打印单词数
wc -l luffty.txt | 文件的行数 |
---|---|
wc -w | 打印单词数 |
wc -m | |
wc -L | 打印最长行的长度 |
tr命令
tr命令从标准输入中替換、缩减或删除字符,将结果写入到标准输出
用法: tr[选项]...SET1[SET2]
从标准输入中替換、缩减和/或删除字符,并将结果写到标准输出。
字符集1:指定要转换或刪除的原字符集。
当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。
但执行删除操作时,不需要参数“字符集2
字符集2:指定要转换成的目标字符集。
-c或 complement:取代所有不属于第一字符集的字符;
-d或 delete:删除所有属于第一字符集的字符;
-s或 --squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或 --truncate-set1:先删除第一字符集较第二字符集多出的字符。
echo "my name is lf" | tr '[a-z]' '[A-Z]' | 小写改大写 |
---|---|
cho "my name is lf and i am 999years" | tr -d 'a-z' | 删除字母 |
tr 'a' A' < alex.txt | 将文件中的a 替换为A |
echo “iiiii am lllllfffffff” | tr -s ‘ialf’ | 把连续重复的字符以单独一个字符表示; |
Find命令 xargs 精讲
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。
如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。
并且将查找到的子目录和文件全部进行显示。
find 查找目录和文件, 语法:
find 路径 一命令参数 [输出形式]
参数说明: 路径:告诉find在哪儿去找你要的东西,
参数 | 解释 |
---|---|
pathname | 要查找拢的路径 |
options选项 | |
-maxdepth | <目录层级>:设置最大目录层级; |
-indepth | <目录层级>:设置最小目录层级 |
-atime | 按照文件访问 accesse的时间查找,单位是天 |
-ctime | 按照文件的改变 change状态来查找文件,单位是天 |
-mtime | 根据文件修改 modify时间查找文件最常用 |
name | 按照文件名字查找,支持*?通配符 |
group | 按照文件的所属组查找 |
perm | 按照文件的权限查找 |
size ncwbkmg | 按照文件的大小为n个由后缀決定的数据块。 其中后缀为 b:代表512位元组的区块(如果用户没有指定后缀,则默认为b) c:表示字节数 k:表示 kilo bytes(1024字节) 字(2字节) M:兆字节(1048576字节) G:千兆字节(1073741824字节) |
-type查找某一类型的文件 | b-块设备文件。 d-目录。 c-字符设备文件。 p-管道文件。 1-符号链接文件。 f-普通文件。 s- socket文件 |
user | 按照文件属主来查找文件。 |
-path | 配合- prune参数排除指定目录 |
Actions模块 | |
-prune | 使find命令不在指定的目录寻找 |
-delete | 刪除找出的文件 |
-exec或-ok | 对匹配的文件执行相应 shell命令 |
将匹配的结果标准输出 | |
OPERATORS | |
! | 取反 |
-a -o | 取交集、并集,作用类似&&和 |
find / -name "*.c" | 全局搜索.c结尾的文件 |
---|---|
find /opt -name "*.c" | 在/opt 下寻找 .c 文件 |
find /opt -maxdepth 1 -name "*.c" | 在/opt 下一级目录 寻找 .c 文件 |
touch {1..10}lf.txt | 创建多个文件 |
find . -name "[0-9]*" | 找开头0-9的文件 |
mkdir {0..10}lf | 创建连续的文件夹 |
find . -type f -name "[0-9]*" | 只找文件 |
find . -type d -name "[0-9]*" | 只找文件夹 |
find . -type d -name "[0-9]*" -delete | 只找文件夹并删除 |
find . -type f -name "[0-9]*" -delete | 只找文件并删除 |
find . -atime -2 | 查找两天前的访问文件 |
---|---|
find -atime 2 | 2天时被访问的文件 |
find -atime +2 | 超过2天内被访问的文件 |
find . -maxdepth 2 ! -type d | 取反操作 |
---|---|
find . -type f -size +200M | 超过200M的文件 |
find . -path "./text" -prune -o -name "*.txt" -print | 排除./text文件搜寻 |
xargs命令
xargs又称管道命令, 构造参数等
是给命令传递参数的一个过滤器,也是组合多个命令的一个工具它把一个数据流分割为一些足够小的块,以方 便过滤器和命令进行处理。
简单的说就是把其他命令的给它的数据,传递给它后面的命令作为参数
-d 为输入指定一个定制的分割符,默认分隔符是空格
-i 用{}代替传递的数据
-I string用 string来代替传递的数据-n[数字]设置每次传递几行数据
-n 选项限制单个命令行的参数个数
-t 显示执行详情
-p 交互模式
-P n允许的最大线程数量为n
-s [大小] 设置传递参数的最大字节数(小于131072字节)
-x 大于 -s 设置的最大长度结東 xargs命令执行
-0, --null 项用null分隔,而不是空白,禁用引号和反斜杠处理
xargs < lf.txt | 多行变一行 |
---|---|
xargs -n 2 < lf.txt | 每行最多2个 |
echo "aasd, dwfam,ffef" | xargs -d "," | 去, |
echo "aasd, dwfam,ffef" | xargs -d "," -n 2 | 去, 每行最多2个 |
find . -name "*.txt" | xargs -i mv {} alltxt/ | 将当前文件所有的txt移动到alltxt文件 |
find -name "*.txt" | xargs -I alltxt mv alltxt ../ | 将搜寻到的文件命名为alltxt 并移动到上级目录 |
tar gzip zip命令
语法:
tar(选项)(参数)
-A或--catenate:新增文件到以存在的备份文件;
-B:设置区块大小
-c或 --create:建立新的备份文件;
-C<目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
-d:记录文件的差别;
-X或--extract或 --get:从备份文件中还原文件;
-t或--list:列出备份文件的内容
-z或--gz1ip或 --unzip:通过gzip指令处理备份文件;
-Z或--compress或-- uncompress:通过 compress指令处理备份文件;
-f<备份文件>或ーーfile=<备份文件>:指定备份文件;
-v或 --verbose:显示指令执行过程; r:添加文件到已经压缩的文件;
-u:添加改变了和现有的文件到已经存在的压缩文件
-j:支持bz1p2解压文件; 显示操作过程
-L:文件系统边界设置
-k:保留原有文件不覆盖;
-m:保留文件不被覆盖
tar -cvf all.tar ./* | 将当前目录的内容打包到all.tar 其中:v显示过程 |
---|---|
tar -xvf ./all.tar ./ | 将当前的all.tar解压 |
tar -czvf all.tar.gz ./* | 将当前目录打包并压缩z |
tar -xzvf ../all.tar.gz ./ | 解压到当前目录 |
tar -ztvf all.tar.gz | 列出压缩文件的内容 |
tar -zxvf all.tar.gz ./lf.txt | 解压其中一项 |
tar -xzvf ../all.tar.gz - C ./qwe | 解压到指定目录 |
tar -zxvf ./all.tar.gz --exclude lf.txt | 解压时排除 |
gzip 压缩文件夹
zip 压缩 unzip解压缩
正则表达
由一类特殊字符及文本字符所编写的模式,其中有些符不表示其字面意义,而是用于表示控制或通配的功能;
基本正则表达式:BRE
扩展正则表达式:ERE
正则表达式的意义
-
处理大量的字串
-
处理文本
通过特殊符号的辅助,可以让inux管理员快速过滤、替換、处理所需要的字符串、文本,让工作高效。
通常 Linux运维工作,都是面临大量带有字符串的内容,如
- 配置文件
- 程序代码
- 命令输出结果
- 日志文件
且此类字符串内容,我们常会有特定的需要,查找出符合工作需要的特定的字符串,因此正则表达式就出现
- 正则表达式是一套规则和方法
- 正则工作时以单位进行,一次处理一行
- 正则表达式化繁为简,提高工作效率
- linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用
正则表达式应用非常广泛,应用在如 Python、Java、Perl等, Linux下普通命令无法使用正则表达式的,只能 使用三剑客 。
通配符是大部分普通命令都支持的,用于查找文件或目录,而正则表达式是通过三剑客命令在文件(数据流)中过滤内容的
Linux三剑客
文本处理工具,均支持正则表达式引擎
- grep:文本过滤工具,(模式: pattern)工具
- sed: stream editor,流编辑器;文本编辑工具
- awk: Linux的文本报告生成器(格式化文本), Linux上是gawk
正则表达式的分类
Linux三剑客主要分两类
・基本正则表达式(BRE、 basic regular expression)
BRE对应元字符有^$.[]*
・扩展正则表达式(ERE、 extended regular expression)
ERE在在BRE基础上,増加上(){}?+|
等字符
基本正则表达式BRE集合
- 匹配字符
- 匹配次数
- 位置锚定
^ | 尖角号,用于模式的最左侧,如"^ oldboy",匹配以 oldboy单词开头的行 |
---|---|
$ | 美元符,用于模式的最右侧,如" oldboys",表示以 oldboy单词结尾的行 |
^$ | 组合符,表示空行 |
. | 匹配任意一个且只有一个字符,不能匹配空行 |
\ | 转义字符,让特殊含义的字符,现出原形,还原本意,例如.代表小数点 |
* | 匹配前一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容 |
.* | 组合符,匹配所有内容 |
^.* | 组合符,匹配任意多个字符开头的内容 |
.*$ | 匹配以任意多个字符结尾的内容 |
[abc] | 匹配[]集合内的任意一个字符,a或b或c,可以写[a-c] |
[^abc] | 匹配除了へ后面的任意字符,a或b或c,^表示对abl的取反 |
扩展正则表达式ERE集合
扩展正则必须用grep -E
才能生效
字符 | 作用 |
---|---|
+ | 匹配前一个字符1次或多次 |
[:/]+ | 匹配括号内的":“或者”/"字符1次或多次 |
? | 匹配前一个字符0次或1次 |
\ | 表示或者,同时过滤多个字符串 |
() | 分组过滤,被括起来的内容表示一个整体 |
a{n,m} | 匹配前一个字符最少n次,最多m次 |
a{n,} | 匹配前一个字符最少n次 |
a{n} | 匹配前一个字符正好n次 |
a{,m} | 匹配前一个字符最多m次 |
grep
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行
模式:由正则表达式的元字符及文本字符所编写出的过滤条件;
语法:
grep [options] [pattern] file
命令 参数 匹配模式 文件数据
-i: ignorecase,忽略字符的大小写
-0:仅显示匹配到的字符串本身;
-v,invert- match:显示不能被模式匹配到的行
-E:支持使用扩展的正则表达式元字符;
-q,-- quiet,- silent:静默模式,即不输出任何信息;
grep命令是 Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据, 如果再配合正则表达式,功能十分强大,是 Linux运维人员必备的命令
grep命令里的匹配模式就是你想要找的东西,可以是普通的文字符号,也可以是正则表达式
参数选项 | 解释说明 |
---|---|
-v | 排除匹配结果 |
-n | 显示匹配行与行号 |
-i | 不区分大小写 |
-c | 只统计匹配的行数 |
-E | 使用 egrep命令 |
--color = auto | 为grep过潓结果添加颜色 |
-w | 只匹配过滤的单词 |
-o | 只输出匹配的内容 |
案例 | 解释 |
---|---|
grep "root" pwd.txt -n | 在文本中找到root所在行 并显示行号 |
grep "root" pwd.txt -n -i | 在文本中不区分大小写找到root所在行 并显示行号 |
grep "root" pwd.txt -c | 统计匹配结果的行 |
grep '^$' list.c -n | 寻找空行 |
grep '^$' list.c -n -v | 寻找非空行 |
grep '^#' list.c -n | 寻找以#开头的行 |
grep '^#' list.c -v | grep '^$' -v -n | 寻找非#开头的和非空的行 |
grep -n -i ';$' list.c | 寻找到以;结尾的行 |
grep '.s' list.c -n | 寻找带s的行`` |
grep '[A-Z]' list.c -n | 寻找大写内容 |
grep '[A-Z0-9]' list.c -n | 寻找大写以及数字 |
grep -E 'int{1,2}' list.c -o | 匹配前一个int字符最少n次,最多m次 |
sed
注意sed和awk使用单引号,双引号有特殊解释
sed是 Stream Editor(字符流编辑器)的缩写,简称流编辑器。
sed是操作、过滤和转換文本内容的强大工具。
常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤 指定字符串)、取行(取出指定行)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zoPiDRfF-1620385273066)(图/截屏2021-04-11 上午10.58.32.png)]
语法:
sed [选项] [sed内置命令字符] [输入文件]
选项 | 解释 |
---|---|
-n | 取消默认sed的输出, 常与sed内置命令p一起用 |
-i | 直接将修改结果写入文件,不用-i,sed修改的是内存数据 |
-e | 多次编辑,不需要管道符了 |
-r | 支持正则扩展 |
sed的 内置命令字符用于对文件进行不同的操作功能, 如对文件增删改查
sed常用内置命令字符:
sed的内置命令字符 | 解释 |
---|---|
a | append,对文本追加,在指定行后面添加一行/多行文本 |
d | Delete,删除匹配行 |
i | insert,表示插入文本,在指定行前添加一行/多行文本 |
p | Print,打印匹配行的内容,通常p与-n一起用 |
s/正则/替换内容/g | 匹配正则内容,然后替換内容(支持正则),结尾g代表全局匹配 |
sed匹配范围
范围 | 解释 |
---|---|
空地址 | 全文处理 |
单地址 | 指定文件某一行 |
/pattern/ | 被模式匹配到的每一行 |
范围区间 | 10,20十到ニ十行,10,+5第10行向下5行,/ pattern1/,/ pattern2/ |
步长 | 12,表示1、3、5、7、9行,22两个步长,表示2、4、6、8、10、偶数行 |
示例 | 解释 |
---|---|
sed "2,3p" list.c -n | 打印2,3行 |
sed "2,+3p" list.c -n | 打印2向下三行 |
sed /File/p list.c -n | 打印与File有关的行 |
sed /File/d list.c | 删除有File的行 |
sed /File/d list.c -i | 在文件内部删除有File的行 |
sed '5, $d' list.c -i | 在文件内部删除第5行的所有内容 |
sed "s/My/I/g" list.c | 在全局中将My替换为I |
sed "2a My linux is good." | 在第二行追加My linux is good. |
sed -e "s/I/My/g" -e "s/123/345/g" list.c | 同时修改 |
sed "4i My linux is good." | 在第4行之前插入 |
sed "a -----------" list.c | 每一行后加入--------------- |
ifconfig eth0 | sed '2p' -n | sed "s/^.*addr://" | sed "s/Bcast.*$//" | 掐头去尾 |
awk文本格式化
更适合编辑、处理匹配到的文本内容
awk语法:
awk [option] 'pattern [action]' file...
awk 参数 '条件动作' 文件
Action指的是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print
和printf
我们执行的命令是``awk’{print $2}’,没有使用参数和模式,
$2`表示输出文本的第二列信息
avk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符
awk是按行处理文件,一行处理完毕,处理下一行,根据用户指定的分割符去工作,没有指定则默认空格.
指定了分隔符后,awk把每一行切割后的数据对应到內置变量
awk内置变量
内置变量 | 解释 |
---|---|
$n | 指定分隔符后,当前记录的第n个字段 |
$0 | 完整的输入记录 |
FS | 字段分隔符,默认是空格 |
NF | 分割后,当前行一共有多少个字段 |
NR | 当前记录数,行数 |
更多内置变量可以man手册查看 | man awk |
案例 | 解释 |
---|---|
awk '{print $1,$4,$5} lf.txt' | 打印多列 |
awk '{print $1 "\t" $4 "\t" $5} lf.txt' | 打印多列 制表符对齐 |
awk '{print "第一列:" $1 ,"第二列:" $2} lf.txt' | 自定义输出 |
awk 'NR==5{print $0}' lf.txt | 打印第五行内容 |
awk 'NR==5,NR==6{print $0}' lf.txt | 打印第五六行内容 |
awk '{print NR $0}' lf.txt | 打印行号 |
awk 'NR==5,NR==6{print NR $0}' lf.txt | 行号 行位 |
awk '{print $1,$(NF-1)}' lf.txt | 第一列 倒数第二页 |
awk分隔符
awk的分隔符有两种
-
输入分隔符,awk默认是空格,空白字符,英文是 E field separator,变量名是FS
-
输出分隔符, output field separator,简称OFS
FS输入分隔符
awk逐行处理文本的时候,以输入分割符为准,把文本切成多个片段,默认符号是空格
当我们处理特殊文件,没有空格的时候,可以自由指定分隔符特点
案例 | 解释 |
---|---|
awk -F ":" '{print $1}' lf.txt | 1⃣️ |
awk -v FS=":" '{print $1}' lf.txt | 同上 |
awk -F ":" -v OFS="===" '{print $1,$NF} lf.txt' | 修改默认 |
awk -F ":" -v OFS="\t" '{print $1,$NF} lf.txt' | |
awk变量
awk参数
参数 | 解释 |
---|---|
-F | 指定分割字段符 |
-v | 定义或修改一个awk内部的变量 |
-f | 从脚本文件中读取awk命令 |
对于awk而言,变量分为
- 内置变量
- 自定义变量
内置变量 | 解释 |
---|---|
FS | 输入字段分隔符,默认为空白字符 |
OFS | 输出字段分隔符,默认为空白字符 |
RS | 输入记录分隔符(输入换行符),指定输入时的换行符 |
ORS | 输出记录分隔符(输出换行符),输出时用指定符号代替换行符 |
NF | NF: number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量 |
NR | 行号,当前处理的文本行的行号。 |
FNR | 各文件分别计数的行号 |
FILENAME | 当前文件名 |
ARGC | 命令行参数的个数 |
ARGV | 数组,保存的是命令行所给定的各参数 |
awk格式化
前面我们接触到的awk的输出功能,是{ print}的功能,只能对文本简单的输出,并不能美化或者修改格式
printf格式化输出. 能够对文本格式化输出 同C的用法一样
awk模式 pattern
awk是按行处理文本,刚才讲解了 print动作,现在讲解特殊的 pattern: BEGIN和END
- BEGINA模式是处理丈本之前需要执行的操作
- END模式是处理完所有行之后执行的操作
awk 'NR<4{print $0}' lf.txt
满足条件打印
pattern有关系运算符
小结
- 空模式,没有指定任何的模式(条件),因此每一行都执行了对应的动作,空模式会匹配文档的每 行,每一行都满足了(空模式)
- 关系运算符模式,awk默认执行打印输出动作
- BEGIN/END模式(条件设置)
练习
案例 | 实现 |
---|---|
找出有关root的行 | grep "root" /etc/passwd |
找出有关root的行 以root开头 | grep "^root" /etc/passwd |
匹配以root开头的行 或者以liufeng开头的行 | grep -E "^(root|liufeng)" /etc/passwd |
过滤出bin开头的行 并显示行号 | grep "^bin" /etc/passwd -n |
过滤出除了root的行 | grep "^root" -v /etc/passwd |
统计liufeng用户出现的次数 | grep "liufeng" -c /etc/passwd |
显示不以/bin/bash结尾的行 | grep -v "/bin/bash$" /etc/passwd |
找出文件中的两位数或三位数 | grep -E "\<[0-9]{2,3}\>" /etc/passwd |
找出文件中所有函数名 | grep -E "[a-zA-Z]+\(\)" /etc/init.d/functions |
案例 | 实现 |
---|---|
将root替换为liufeng | sed 's/root/liufeng/' passwd |
将全部的root替换为liufeng | sed 's/root/liufeng/g' passwd |
仅仅打印替换的内容 | sed 's/root/liufeng/gp' passwd -n |
将前10行b开头的打印 | sed -n '1,10p' passwd |
删除4行后面所有行 | sed '5,$d' passwd |
删除root到ftp的行 | sed '/^root/,/^ftp/d' passwd |
删除注释行和空白行 | sed -e '/^#/d' -e '/^$/d' liufeng.txt |
给文件的前三行添加@ 符号 | sed -r '1,3s/(^.)/@\1/' liufeng.txt |
取出ip地址 | ifconfig eth0 | sed '2p' -n | sed 's/^.*addr://' | sed 's/Bcast.*//' |
示例 | 实现 |
---|---|
打印普通用户和家目录 | awk -F ':' '$3>=1000{print $1 , $(NF-1)}' /etc/passwd |
前5行添加#号 | awk 'NR<6{print "#" $0}' /etc/passwd |
`` |