赞
踩
grep
%全文搜索
Linux 命令三剑客,sed、grep、awk。
sed:擅长数据修改。
grep:擅长数据查找定位。
awk:擅长数据切片,数据格式化,功能最复杂
基本正则表达式元字符
元字符 功能 例子 匹配结果字符的匹配 . 匹配单个任意字符 /l.ve/ love、live...
. :代表着任意一个字符
“*”:代表的是重复零个或者多个前面的单个字符,“o*”表示拥有零个或大于等于一个“o”的字符,因为允许空字符,所以执行”grep -n ‘o*’ a.txt“会将文本中所有内容都输出打印,”oo*“表示第一个o必须存在,第二个o则是零个或多个o;”ooo*“表示第一个和第二个o必须存在,第三o则是零个或多个
查找连续字符范围,“{}”可以限制一个范围内的重复的字符串,因为在shell中{}有特殊意义,所以使用“{}“字符时,需要利用转义字符”\",将”{}”字符转换成普通字符
grep "r\{2\}" a.txt
Error
error
- 查询包含两个r字符的行
[] 匹配括号内的任意单个字符 /l[Oo]ve/ love、lOve
[x-y] 表示匹配一段范围中的任意一个字符 /l[a-d]ve/ lave、lbve、lcve、ldve
[0-9] 匹配0-9中的任意一个字符
[1-9][0-9] 匹配10-99中的任意一个字符
[a-z] 匹配a-z中的任意一个字符
[A-Z] 匹配A-Z中的任意一个字符
[0-9a-zA-Z] 匹配a-zA-Z0-9中的任意一个字符
.*匹配任意长度的字符串
\+ 匹配前面的字符至少出现一个
[^] 表示取反 /l[^a-c]ve/ 匹配除lave、lbve、lcve以外的其他字符
次数的匹配 * 匹配0个或多个它前面的字符 /l*ve/ ve、 lve、llve....
x\{m\} x是字符或字符串,m是一个数字 /r\{2\}/ 匹配 rr
匹配x出现m次
x\{m,\} 匹配x出现至少m次 /r\{2,\}/ 匹配 rr、rrr、rrrr...
x\{m,n\} 匹配x出现m次到n次 /r\{3,5\}/ 匹配rrr、rrrr、rrrrr
x\{0,n\} 匹配x出现最多n次 /r\{0,3\}ve/ 匹配ve、rve、rrve、rrrve
位置的定位 ^ 行首定位符 /^root/ 匹配行首的root字符串
$ 行尾定位符 /bash$/ 匹配行尾bash字符串
\< 词首定位符 /\<love/ 匹配到love、lover...
\b /\blove/ 匹配到love、lover...
\> 词尾定位符 love\> 匹配到aalove、inlove...
\b love\b 匹配到aalove、inlove...
\ 用来转义元字符 /2\.5/ 匹配2.5
\| 或者 /a\|b/ 匹配a或者是b扩展正则表达式元字符
元字符 功能 例子 匹配结果
? 表示0个或1个它前面的字符 /a?d/ ad d aad
+ 表示1个或多个它前面的字符 /a+d/ ad d aad ...
| 或者 /a|b/ a b aa
() 将括号内的内容作为一个单位来看,内容可以是字符串也可以是一种模式
(..)(..) \1\2 引用前面的第#个“(”和与之对应的“)”中的模式匹配到的内容 #-->1~9 \1
x{m} x是字符或字符串,m是一个数字
匹配x出现m次
x{m,} 匹配x出现至少m次
x{m,n} 匹配x出现m次到n次
x{0,n} 匹配x出现最多n次02 grep 命令常用可选参数
-n # 显示行号。
-i # 不区分大小写。-o 仅显示匹配的字串
-c # 统计匹配行,命中查找字符串的总行数。
-v # 显示不包含匹配文本的所有行。
-r # 递归处理。-e # 实现多个逻辑之间的关系or
grep -e root -e bash /etc/passwd
-E # 使用正则表达式作为匹配进行查找(注:-e 没有-E 支持的完整)。
--include # 指定匹配的文件类型。
--exclude # 过滤不需要匹配的文件类型。 使用示例:-A 匹配内容后面几行
-B 匹配内容前面几行
-C 匹配内容前后几行
grep -in "ERROR" info.log #不区分大小写,并显示行号
grep 同时查找多个文件
grep -in "key" access.log error.log # 从文件access.log 和 error.log 查找字符串"key",不区分大小写,并显示行号
grep 递归查找
前面已经总结过,-r/R参数,即 recursion,递归的意思。
grep -rn "key" * # 递归查询当前目录及其子目录所有文件中包含字符串"key",并显示对应的行号。
grep 命令,擅长查找字符串,正向查找,反向查找,正则查找,多文件查找,递归查找等。
用grep 过滤出以#号开头的和空行的行
1、grep -nv '^$'| grep -v '^#' /etc/hosts
2、grep -nv '^#\|^$' /etc/hosts
3、grep -n '^[^#]' /etc/hosts
查看时间节点的日志
grep "2021/05/18 15:20:5[1-5]" logfile
grep "2021-05-18 15:2[1-5]" logfile
grep "31/May/2021:19:3[1-5]" logfile
grep "2[3-7]/May/2021" logfile 按照天数过滤
过滤IP
egrep -o "([0-9]{1,3}\.){3}[0-9]"
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]" secure
grep -E "([0-9]{1,3}\.){3}[0-9]" secure
ifconfig eth0 | grep -w inet | tr -d '[a-zA-Z]'| tr -s " " | cut -d " " -f2
rename命令用字符串替换的方式批量改变文件名。
格式:rename 原名 替换名 要改的文件
命令格式
sed [options] 'command' file(s)
1、选项说明
-i:直接修改文件内容,而不是输出到终端。
-n:安静模式,屏蔽默认输出(全部文本),只有经过sed特殊处理的那一行才会被列出来。
-e :指定sed动作,可以由多个-e指定多个动作。
-r:启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
-f :直接将sed的动作写在一个文件内,-f filename则可以运行filename 内的sed动作;
--help:显示帮助。
--version:显示版本。
-{}:可组合多个命令,以分号分隔
1. 删除操作
sed '2d' file_name 删除file_name文件的第二行
sed '2,$d' file_name 删除file_name文件的第二行到末尾所有行
sed '/test/'d file_name 删除file_name文件所有包含test的行
2. 替换操作
sed '作用范围s/替换查找目标/替换成为/替换目标option' 文件名
# 替换字符串,并更改原文件内容
# 在sed后面加 -i,即编辑文档“edit files in place”选项
sed -i '作用范围s/替换查找目标/替换成为/替换目标option' 文件名sed 's/a/b/g' file 在整行范围内把a替换为b
( s 作用范围在全局 )
sed -n 's/^a/b/p' file (-n)选项和p标志表示只打印替换的行指定行,写上行号;指定某行到某行,用逗号连接行号
# 作用范围在第1行
sed '1s/cat/dog/g' pet.txt# 作用范围在第6行到第10行
sed '6,10s/cat/dog/g' pet.txt# 作用范围在第6行到最后一行
sed '6,$s/cat/dog/g' pet.txtsed '1i 添加的内容' file #这是在第一行前添加字符串
sed '$i 添加的内容' file #这是在最后一行行前添加字符串
sed '$a添加的内容' file #这是在最后一行行后添加字符串
sed '1 astring1 string2 ' /etc/passwd #在第1行后插入两行字符串。
sed '1 istring1 string2 ' /etc/passwd #在第1行前插入两行字符串
sed -i.bak '/apache/d' /etc/passwd 修改文件时先备份
sed -n '/^#/!p' /etc/fstab 打印非#的行
sed -Ei.bak '/^#/!s/^/#/g' /etc/fstab 打印非0的行,首行加上#号
替换一行的内容 -c
sed '2c\file already exist!' a.txt
111
file already exiF
:s/vivian/sky/ #替换当前行第一个 vivian 为 sky
:s/vivian/sky/g #替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ #替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g #替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
# (n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/vivian/sky/ #(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g #(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
# 过滤输出
cat 20200927-9-10_1983712 | egrep '\|2020-09-27 .{8}\|9\|10\|' > 9-10.txt
# 取第N个字段,去重排序
cat sdk.log | grep sdk_login | wk -F '|' '{print $20}' | sort | uniq | wc -l
给1,5行加注释s/^/#/
sed -i -e "1,5 s/^/#/" hello
截取字符串
biaobiao=http://www.baidu.com.7777.txt
删除左边的,保留右边的
实例一
echo ${biaobiao#*//}
www.baidu.com.7777.txt----------输出结果
echo ${biaobiao#*.}
baidu.com.7777.txtecho ${biaobiao##*.} -----------会删除左边所有复合条件的.
txt
%删除右边的保留左边的
biaobiao=http://www.baidu.com.7777.txt
echo ${biaobiao%.*}
http://www.baidu.com.7777echo ${biaobiao%%.*}
http://www 会删除右边所有复合条件的.
截取起始到结束字符
echo ${biaobiao:0:5}
http:
3、打印
sed -n '/k8s/=' sed.task
## =打印行号
nl会打印出行数(空格不算)
nl sed.task
1 openssh
2 docker
3 k8s
4 openssh
5 docker
4、追加 a追加的意思,也可以说是插入
sed -i '3a jenkins' sed.task
### 在第三行添加一行sed -i '4a gitlab\nshell' sed.task
###添加多行
awk '{print "hello,world"}' 字符串一定要加双引号,要不然会认为是变量.
awk 默认是逗号作为空格分隔符。
awk
$0:表示整个文本
$1:表示文本行中的第一个字段
$NF:表示文本行中最后一个数据字段
$NR : 表示行
要求打印第三行
案例1: awk -F: 'NR == 3{print $0} /etc/passwd'
解析: NR : 行号 NR == 3 :
行号等于3
注意: $1 : 是列
NR == 3 : 是行
awk 数学运算
[root@101 scripts]# awk 'BEGIN{print 100+3}'
103
[root@101 scripts]# awk 'BEGIN{print 100/3}'
33.3333
[root@101 scripts]# awk 'BEGIN{print 100-3}'
97
[root@101 scripts]# awk 'BEGIN{print 100*3}'
300
[root@101 scripts]# awk 'BEGIN{print 100%3}'
1
cut
Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字
说明:默认分隔符是制表符。
选项与参数:
-d:分隔符,按照指定分隔符分割列。与 -f 一起使用
-f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思(列号,提取第几列)
-c:以字符 (characters) 的单位取出固定字符区间
-b:以字节为单位进行分割
如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。
tr
Linux tr 命令用于转换或删除文件中的字符。
tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。
参数说明:
字符集合的范围:
cat test.tr_txt |cut -d= -f2 | tr '\n' + | grep -Eo '.*[0-9]+' | bc
find
find [查找路径 ...] [查找条件] [处理动作]
还有种表述方式:find PATH OPTION [-exec COMMAND { } \;]
find命令会根据我们给的option
Linux之find exec
-exec参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。
find . -type f -name '*.sh' -exec mv {} /data/scripts/ \; --刚测试了本地的
带大家理解一下find查找的以.sh开头的 ;exec 重定向到 {} 里面; 当执行mv的时候、就会把.sh 移动到目标路径里面----;
在option中,具体有参数:
-name ’字串’ 查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]。
-lname ’字串’ 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符 *、?、[ ]。
-gid n 查找属于ID号为 n 的用户组的所有文件。
-uid n 查找属于ID号为 n 的用户的所有文件。
-group ’字串’ 查找属于用户组名为所给字串的所有的文件。
-user ’字串’ 查找属于用户名为所给字串的所有的文件。
-empty 查找大小为 0的目录或文件。
-path ’字串’ 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[ ]。
-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。
-size n[bckw] 查找指定文件大小的文件,n 后面的字符表示单位,缺省为 b,代表512字节的块。
-type x 查找类型为 x 的文件,x 为下列字符之一:
b 块设备文件
c 字符设备文件
d 目录文件
p 命名管道(FIFO)
f 普通文件
l 符号链接文件(symbolic links)
s socket文件
-xtype x 与 -type 基本相同,但只查找符号链接文件。
以文件的大小查找
-size [+/-]#
{k|M|G}
-size 2M 0.8M 1M 1.1M
-size 1k
以时间为条件查找
-amin n 查找n分钟以前被访问过的所有文件。
-atime n 查找n天以前被访问过的所有文件。
-cmin n 查找n分钟以前文件状态被修改过的所有文件。
-ctime n 查找n天以前文件状态被修改过的所有文件。
-mmin n 查找n分钟以前文件内容被修改过的所有文件。
-mtime n 查找n天以前文件内容被修改过的所有文件。
-print:将搜索结果输出到标准输出。
sort
. sort的-u选项
它的作用很简单,就是在输出行中去除重复行。
. sort的-r选项
uniq options filename
-i:忽略大小写
-c:统计重复行次数
-d:只显示重复行
sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。
sort -n
按以数值排序。
diff 比较两个文件内容的不同
[root@101 scripts]# echo -e "\n 111 \n 222 \n 333" > a.txt
[root@101 scripts]# cat a.txt
111
222
333
[root@101 scripts]# echo -e "\n 111 \n 222 \n 444" > b.txt
[root@101 scripts]# cat b.txt
111
222
444
[root@101 scripts]# diff a.txt b.txt
4c4
< 333
---
> 444
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。