目录
正则表达式
grep命令
grep命令的语法
grep -v:取反
grep -m:多个匹配只取第一个
grep -n:显示匹配内容和匹配行号
grep -o:仅显示匹配到的字符串,不再输出其他内容
grep -A:after 显示匹配到的行以及匹配行的后几行(行数可自定义)
grep -B:before 显示匹配行以及匹配行的前几行(行数可自定义)
grep -C:显示匹配行以及匹配行的前后各几行(行数可自定义)
grep -e:实现多个选择逻辑或的关系(逻辑关系可以有多个)
grep -f:过滤出两个文件相同内容
grep -r:递归目录下所有包含过滤内容的文件以及匹配的内容行。但是不处理软连接ln -s
grep -R:递归目录下所有包含过滤内容的文件以及匹配的内容行。但是不处理软连接
| 管道符的方式同样也可以
sort命令
sort -n:按照数字进行排序
sort -r:反向排序
sort -u:去重,相同的数据行只显示一行
小练习
uniq命令
sort去重和uniq去重的区别
uniq -c:统计连续重复的行的次数,合并重复的行
uniq -u:显示仅出现一次的行(包括不连续的重复行也算仅出现一次的行)
uniq -d:仅显示重复出现的行(必须是了连续的重复行)
tr命令
tr -c:必须保留字符集1的字符,其他字符用字符集2来进行替换
tr -d:删除字符集
tr -s:将重复出现的字符串压缩为一个字符。
tr -t:替换可以不加选项-t
cut命令
cut -f:对字段进行截取
文件拆分
split -l:指定行数拆分
分件合并
paste和cat的区别
paste:左右合并
cat:上下合并
小练习
正则表达式
通配符和正则表达式的区别
元字符
转义符
基本正则表达式
表示次数
*:匹配前面的字符任意次包括0次,尽可能长的匹配
.*:匹配前面的字符任意次,但是不包括0次。也就是匹配所有。
\?:匹配前面的字符出现0次,或者1次。有且只有一次
\ +:匹配前面出现的字符,至少出现一次,也就是>=1
\ {n \ }:匹配前面出现的字符等于几次
\ {m,n \ }:匹配前面出现的字符最少m次,最多是n次
\ { ,n \ }:匹配前面的字符最多n次。没有也算
\ {n, \ }:匹配前面的字符最少n次,只要连续出现n次,后面的都算。
例题:过滤出IP地址
基本正则表达式总结
位置锚定
^:行首锚定。以什么为开头
$:行尾锚定。以什么为结尾
^root$:匹配行模式。整行匹配且需要单独一行只有这一个
^$:是空白行
\ < 或者 \b:词首锚定
\ > 或者 \b:词尾锚定
位置锚定总结
分组以及逻辑或
():分组
\ | :逻辑或
sed编辑器
sed的操作格式
sed的功能
文本内容过滤-----sed
思考题
sed使用扩展正则表达式
思考题
sed删除文件内容
指定删除
匹配字符串的内容进行删除
sed修改和替换
把大写转换成小写
练习题
单字符替换
sed新增命令
sed的总结
awk
awk的格式
awk的常用选项
awk的内置变量
awk的总结
awk的内置变量
指的是对文件内容进行的增删改查
例如linux的文本三剑客:grep、sed、awk
grep:表示过滤(查找文本内容---配合正则表达式一块使用)查
sed:表示修改
awk:表示对行来进行却列,awk自带编程,类java
grep命令主要作用就是对日志内容进行过滤。
grep命令都是按行来处理的
表示找出不包含“root”的行
grep -m 表示多个匹配,后面的数字可以自定义,不加数字会报错
grep -f会以第一个文件为标的:只看红色部分。红色部分就是匹配到的部分
sort:以行为单位对文件内容进行排序,也可以根据不同的数据类型进行排序
写法1
sort 选项 参数
写法2
cat /etc/passwd | sort 选项 参数
sort -b:忽略每行前面的空格,进行排序,而不是把空格缩进,有空格也不影响排序
sort -o:输出文件。把排序后的结果输出到指定的内容文件
把原文件格式不变定向传输到另一个文件中
快捷去重 uniq:用于报告或者忽略文件中连续的重复行。常与sort命令结合使用
写法1
uniq 选项 参数
写法2
cat 文件 | uniq 选项
tr的作用就是对字符进行替换压缩和删除
tr 选项 参数
echo 123: | tr 选项
常用选项:
替换的字符集默认输出2个
tr -s:相同行的内容不会压缩,只会压缩相同的字符
cut:对字段进行截取和裁剪
cut 选项 参数
cat 文件名 | cut 选项
cut -d:指定分隔符
以冒号为分割符,截取1-3列
以冒号分割符,截取1和3列
cut -b:以字节为单位截取
cut -c:以字符为单位截取
cut -complement:排除所指定的字段
cut --output-delimiter:更改原内容的分隔符
cut命令和awk有相似之处,都是对行来去列。
cut的默认分割符是tab键。主要是切文本,指定分隔符明显最好是指向性越强越好
awk的默认分隔符就是空格,把多个连续的空格当作一个处理
split:可以把文件拆分成若干个小文件
用split命令对文件进行拆分
split -b:指定文件大小进行拆分
文件大可以用大小来切,文件小可以用行数来切。无法合并
分件合并:paste
文件合并输出了才可以保存
如何统计当前主机的连接状态。有多少个listen监听。有多少个estab
核心:匹配文件内容。根据特定的字符和表达式匹配文件内容。
在Linux环境下:grep命令、sed命令、awk命令
nginx、mysql配置文件也可以支持正则表达式
*匹配任意一个或者多个字符
?匹配任意一个字符
[] 可以是范围匹配,也可以是单个字符
通配符只是匹配文件名和文件内容没有关系
. 点表示匹配任意单个字符,可以是一个汉字。
\ 配上.点,变成斜杠\ .点。此时点就代表点
()表示分组 只有\ ( \ )才表示()
[] 表示匹配任意范围内的单个字符
红字就标识正则表达式
使用正则表达式一定要把匹配内容引起来
[^a-z] 取反
”[[:blank:]]“ 既可以匹配空格也可以匹配制表符(tab)
"[]" 只能匹配空格
"[:space:]" 空格 tab键 换行符 回车 各种类型的空白都可以匹配
" [:cntrl:]" 匹配退格 删除
这里*表示前面的o出现了多少次(没有也可以匹配)
ifconfig ens33 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
*:匹配前面的字符任意次包括0次,尽可能长的匹配
.*:匹配前面的字符任意次,但是不包括0次。也就是匹配所有。
\?:匹配前面的字符出现0次,或者1次。有且只有一次
\ +:匹配前面出现的字符,至少出现一次,也就是>=1
\ {n \ }:匹配前面出现的字符等于几次
\ {m,n \ }:匹配前面出现的字符最少m次,最多是n次
\ { ,n \ }:匹配前面的字符最多n次。没有也算
\ {n, \ }:匹配前面的字符最少n次,只要连续出现n次,后面的都算。
^[[:space:]]:也表示空白行
一般用于匹配单词模式的左侧
从左往右全部都算,所有一起都包含,所有都算匹配到
一般用于匹配单词模式的右侧
只匹配右侧的单词,左侧的单词不匹配
^:行首锚定。以什么为开头
$:行尾锚定。以什么为结尾
^root$:匹配行模式。整行匹配且需要单独一行只有这一个
^$:是空白行 ^[[:space:]]:也表示空白行
\ < 或者 \b:词首锚定 从左往右全部都算,所有一起都包含,所有都算匹配到
\ > 或者 \b:词尾锚定 只匹配右侧的单词,左侧的单词不匹配
不是连续出现,只算出现一次
加了()相当于把1abc和2abc合并为1组
grep -E 扩展正则表达式
1 * :匹配前面的字符任意次包括0次,尽可能长的匹配
2 . * : 匹配前面的字符任意次,但是不包括0次。也就是匹配所有。
3 ?: 匹配前面的字符出现0次,或者1次,有且只有一次。
4 +:匹配前面出现的字符,至少出现一次,也就是>=1,
5 {n }:匹配前面出现的字符等于几次。
6 {m,n }:匹配前面出现的字符最少M次,最多是n次
7 { ,n } : 匹配前面的字符最多N次,没有也算。
8 { n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。 9 |:表示逻辑或 grep -E egrep 扩展正则表达式这两个都可以
文本三剑客:grep过滤文本内容 查
sed:行编辑器
sed也是按行来处理。
sed是一种流编辑器。每一次处理内容只有确认才会生效。如果不确认,只是把模式空间的临时数据展示给用户,然后删除。
sed是按照文本的行,一行一行向下处理,知道文件的最后一行。
默认情况下:sed都是在模式空间执行,因此元文件不会发生变化。
sed -e "操作" 文件1 文件2
sed -e "操作1;操作2" 文件
sed -e:指定命令来处理输入的文本文件。如果只有一个操作那-e可以省略。多个指令才会用-e
sed -f:用特定的脚本文件来处理来处理输入的文件。
sed -i:即时生效。立即生效(慎用)
sed -n:仅显示script处理之后的结果
sed最强的功能就是替换功能
sed的操作符: p: 打印 =:只打印行号 d:删除行
sed的打印功能
sed 'p':打印
sed -e 'p' sed默认自己会输出结果,加上了p打印,就有了两行
sed -n 就是禁止了默认输出
sed -n '2p' 文件名 输出指定行,其他的都没有
sed -n '=' 文件名 只显示行号
=号 只打印行号
sed -n '=;p' 文件名 显示行号和内容
sed -n '$p' 文件名 打印最后一行
sed -n '1,3p' 文件名 范围打印
sed -n '1;3p' 文件名 打印第一行和第三行
sed -n '1p;$p' 文件名 打印第一行和最后一行
或者sed -n -e '1p' -e '$p' 文件名
sed -n 'n;p' 文件名 打印偶数行
n在p的前面就是跳过当前一行,打印下一行。
sed -n 'p;n' 文件名 打印奇数行
p在n的前面就是打印当前一行,跳过下一行继续打印。
方法1
sed -n '/o/p' 文件名 打印所有包含o的行 打印指定的过滤内容
格式:sed -n '/过滤内容/p' 文件名
方法2使用正则表达式进行过滤:^表示以什么为开头 $表示以什么为结尾
cat /etc/passwd | sed -n '4,/bash$/p' 匹配从第四行开始到最后一行bash结尾的行
sed -r 使用扩展正则
{n }:匹配前面出现的字符等于几次。
{m,n }:匹配前面出现的字符最少M次,最多是n次
{ ,n } : 匹配前面的字符最多N次,没有也算。
{ n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。
包含两个99:的所在行打印出来
打印所有要么是以root为开头,要么是以bash为结尾的行
‘d’:操作符,删除的意思是删除行。免交互删除
sed -n '3d;p' 文件名 删除第三行,打印剩余行
sed -n '2,6d;p' 文件名 删除第二行到第六行,打印剩余行
sed -n '5,$d;p' 文件名 删除第五行到最后一行,打印剩余行
sed -n '1,4!d;p' 文件名 取反删除其他行保留1-4行
sed '/o/d' 文件名 删除包含o的行
sed '/one/,/six/d' 文件名 删除one到six之间的行
sed '/one/,/six/!d' 文件名 取反,保留one到six之间的行删除其他行
sed '/^$/d' 文件名 正则匹配删除空行
grep -v '^$' 过滤出非空行
sed和grep两种方法都可以
sed 字符串替换的格式:sed 's/要替换的内容/新的内容/p' 文件名
sed 整行替换的格式:sed '/要替换的内容/c 新的内容' 文件名
s:替换字符串
c:整行替换
y:单字符替换。要替换的内容和新的内容必须要前后长度保持一致
sed -n 's/root/test/p' /etc/passwd 替换第一个出现的root为test
sed -n 's/root/test/2p' /etc/passwd 替换第二个出现的root为test
这里的p表示需要更换第几个。
sed -n 's/root/test/gp' /etc/passwd 替换所有的root为test
练习:以root开头的替换成#号键。/etc/passwd
cat /etc/passwd | sed -n '/^root/ s/^/#/p'
对字母字符进行大小写替换
sed 's/[A-Z]/\l&/g' 文件名 把大写全部转换成小写
l&:转换成小写的特殊符号,需要在l&前面加转义符\一起使用 \l&
sed 's/[a-z]/\u&/' 文件名 把小写字母的开头转换成大写
u&:转换成大写的特殊符号,需要在u&前面加转义符\一起使用 \u&
sed 's/[a-z]/\u&/g' 文件名 把小写字母全部转换成大写
这里g表示全部
替换ip地址
cat ifcfg-ens33 | sed '/IPADDR/c IPADDR=1.1.1.1'
sed 'y/on/12/' 文件名 单个字符替换
要替换的内容和新的内容必须长度一致
a:在匹配行的下一行添加内容
i:在匹配行的上一行添加内容
r:可以在其他文件读取内容,然后在匹配行的行后添加
sed '/原来的内容/a 新的内容' 文件名
sed '/three/a guoqizhenshuai' 文件名 表示在three的下一行插入新的内容
sed '/原来的内容/i 新的内容' 文件名
sed '/three/i guoqizhenshuai' 文件名 表示在three的上一行插入新的内容
sed '/six/r ifconcfg-ens33' 文件名 在six下面一行插入其他文件内的内容
也可以用绝对路径表示sed '/six/r /etc/passwd' 文件名
sed '$a 123' test.txt'
$a:可以在文本的最后一行添加内容(推荐,在文本的行后追加内容是最直观的)
sed '$i 123' test.txt
$i:可以在文本的最后一行的上一行添加内容(不太好用)
echo lwkyylyw | sed -r 's/(lwk)(yy)(lyw)/\3\2\1/' 字符位置替换。可以用数字表示位置
文件名 | sed -r 's/(内容1)(内容2)(内容3)/\1\2\3/'
echo lwkyylyw | sed -r 's/(lwk)(yy)(lyw)/\3\1/' 字符位置替换。也可以删除所代表的数字来实现过滤字符串
扩展正则表达式加分组的方式来替换
sed -f 执行文件 处理对象
练习:提取版本号
提取版本号
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
使用cat 123.txt | sed -r 's/(. * )-(. * )(\.jar)/\2/'
用sed查看10分到50分的所有日志
sed -n '/开头的内容/,/目的开头的内容/p'
思考题:现在有一个文件,文件名我想保留,但是原有的内容我要删除且要使用面交互删除
方法1 cat /dev/null > test.txt
方法2 sed -i 'd' test.txt
sed -e "操作" 文件1 文件2
sed -e "操作1;操作2" 文件
sed -e:指定命令来处理输入的文本文件。如果只有一个操作那-e可以省略。多个指令才会用-e
sed -f:用特定的脚本文件来处理来处理输入的文件。
sed -i:即时生效。立即生效(慎用)
sed -n:仅显示script处理之后的结果
sed使用扩展正则表达式:
sed -r 使用扩展正则
{n }:匹配前面出现的字符等于几次。
{m,n }:匹配前面出现的字符最少M次,最多是n次
{ ,n } : 匹配前面的字符最多N次,没有也算。
{ n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。
sed 可以增删改查
sed 也可以结合正则表达式
但是sed最主要的作用:改 增
使用sed命令时,注意,大文件一定要分割之后再交给sed处理
搭配扩展正则:sed -r {n} {n,} {n,m} {,m} 可以不用加\
使用sed -i 立即生效,要注意,事先做好测试,还要做好备份。
sed的功能
sed最强的功能就是替换功能
sed的操作符: p: 打印 =:只打印行号 d:删除行
sed -n '=;p' 文件名 显示行号和内容
sed -n '$p' 文件名 打印最后一行
sed -n '1,3p' 文件名 范围打印
sed -n '1p;$p' 文件名 打印第一行和最后一行或者或者sed -n -e '1p' -e '$p' 文件名也可以
sed -n 'n;p' 文件名 打印偶数行 n在p的前面就是跳过当前一行,打印下一行。
sed -n 'p;n' 文件名 打印奇数行 p在n的前面就是打印当前一行,跳过下一行继续打印。
sed -n '/过滤内容/p' 文件名 打印所有包含过滤内容的行 打印指定的过滤内容
cat /dev/null > test.txt 免交互删除文件内容或者sed -i 'd' test.txt 两种方法都可以
awk是文本三剑客之一,也是功能最强大的文本工具。同样只针对文本内容
awk是逐行读取输入的文本内容,默认已空格和tab键作为分隔符,但是多个空格或者tab键的空格,会自动压缩成一个。然后按照指定的模式或者条件来执行编辑命令
awk 逐行匹配,符合条件的才会进行格式化输出或者过滤
awk 可以在面交互的情况下实现复杂的文本操作。完成各种自动化的配置
awk '操作符 action(动作)' file
操作符:想干啥 action(动作):怎么干 file:处理对象
awk 'BEGIN'
awk 'BEGIN{x=1};{x++}END{处理动作}' 文件名 (定义一个初始化变量)
awk '操作符 {处理动作}' 文件名 不定义初始化变量可以使用
{} 外部表示定义条件 {}内表示指定操作。
BEGIN 对条件做初始化操作,类似于for ((i=1;i<=10;i++))
awk -f 指定分隔符。如果是空格 tab键,可以不加
awk -v 变量赋值。awk命令不能通过外部获取变量值,只能在内部赋值。
awk '{print}' 处理对象 :打印文本内容
awk '{print}' 处理对象 :打印文本内容
awk '0{print}' 处理对象 :什么都不打印(了解即可)
awk'{print NR}' 处理对象:打印需要处理行的行号
awk'{print NR,$0}' 处理对象:打印需要处理行的行号和全部内容
awk 'NR==3{print}' 处理对象:打印第三行
awk 'NR==3,NR==5{print}' 处理对象:打印第三行到第五行
方法1 awk 'NR==3;NR==5{print}' 处理对象:分别打印第三行和第五行
方法2 awk '(NR>=3)&&(NR>=5){print}' 处理对象:分别打印第三行和第五行
awk 'NR%2==0{print}' 处理对象 打印偶数行
awk 'NR%2==1{print}' 处理对象 打印奇数行
awk 'BEGIN{print 1+2}':加法
awk 'BEGIN{print 1.12+2.09}' :小数加法
方法1 awk 'BEGIN{print 2^3}':求幂的运算
方法2 awk 'BEGIN{print 2 * * 3}':求幂的运算
awk '{print $2,$3}' 文件名 按行取第二列和第三列
练习题:取出文件内第二列和最后一列
cat /etc/passwd | awk -F: '{print $2,$NF}'
NF这里表示最后列
awk精确筛选
$n:这里表示数字。可以通(> < ==)进行数值对比
$n~"字符串":代表这个字段包含某个字符串
$n!~'字符串':代表这个字段不包含某个字符串
$n=='字符串':代表字段要和字符串完全相同
$n!='字符串':不为某个字段
$NF:代表最后一个字段
练习题1:/etc/passwd文件输出最后一个字段中包含bash所在行的第一个字段和最后一个字段
cat /etc/passwd | awk -F: '$NF~bash" {print $1,$NF}'
练习题2:/etc/passwd文件输出只有第一列是root的行,我才打印他的第六列
cat /etc/passwd | awk -F: '$1=="root" {print $6}'
练习题3:/etc/passwd文件输出最后一个字段不包含bash且打印第1列和第6列
指定第六个字段为/home/yy 而且最后一个字段为/bin/bash 满足条件的输出第一列和最后一列
cat /etc/passwd | awk -F: '($6="/home/yy")&&($NF=="/bin/bash") {print $1,$NF}'
打印第三列大于500的输出全部内容
cat /etc/passwd | awk -F: '$3>500 {print}'
if语句:
if $3>500 打印所有
例如:awk -F: '{if ($3>500) {print $0}}' /etc/passwd
继承了java 格式和java也一样
三元表达式的格式:
awk '{条件表达式1?A表达式或者值:B表达式或者值{print}}' 文件名
例题:
awk -F: '{max=($3>=$4)?$3:$4;{print max $0}}' /etc/passwd
过滤出包含home的行
cat /etc/passwd | awk '/home/ {print}'
取出主机名放到hosts.txt里
cat test | awk -F'[ .]+' '{print $2}' >> hosts.txt
使用正则的方式匹配分隔符
当getline和管道符以及重定向符号在一起的时候
重定向:< > 把其中一个文件的内容传给另外一个
|:输出指定内容,到定义的变量,再通过getline调用变量当中的内容然后打印结果
awk '{getline;print}' 文件名
awk '{print;getline}' 文件名
getline函数运行之后会改变awk的内置变量,读取的行数也就发生了变化。
getline在前,就是第1行跳过打印第2行,就是偶数行
getline在后,从第1行开始跳过第2行,就是奇数
使用重定向
awk '{getline < "test1.txt";print $0 > "hosts.txt";}' test1.txt
awk -v 使用-v给变量赋值
从shell脚本里往awk里面传参:
read -p "输入第一个数" num1
read -p "输入第二个数" num2
sum=$(awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1+num2}')
echo $sum
在awk中打印变量不需要加$
输出时改变为+号
NR:行号
FS:列分割符,和F作用一致,如果要使用FS。格式:FS=" "
OFS:输出内容的分隔符
NF:表示最后一个字段
$n:也是属于内置变量
对变量初始化:
awk 'BEGIN{x=1};{x++};END{print x}' text1.txt
计算行从0开始向下计算
定义数组
awk 'BEGIN{a[0]=10;a[1]=20;print a[1]}'
awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a)print i,a[1]}'
通过数组遍历的方式去重
awk '{a[$1]++};END{(for i in a)}{print i,a[i]}}'
索引下标值是唯一的
初始化awk默认从0开始算第1行,自增+1=1时a的值开始遍历文件内容然后把遍历到的值赋值给i 先打印i再打印a对应的索引下标
例题:利用数组下标去重
awk '{a[$1]++};END{(for i in a)}{print i,a[i]}}'
AWK的代码逻辑和shell不是一个逻辑
有几行,循环几次
awk处理行从0开始0自增从1开始
把a的值赋给i
awk -F 指定分隔符。如果是空格 tab键,可以不加
awk -v 变量赋值。awk命令不能通过外部获取变量值,只能在内部赋值。
awk '{print}' 处理对象 :打印文本内容
awk '{print}' 处理对象 :打印文本内容
awk '0{print}' 处理对象 :什么都不打印(了解即可)
awk'{print NR}' 处理对象:打印需要处理行的行号
awk'{print NR,$0}' 处理对象:打印需要处理行的行号和全部内容
awk 'NR==3{print}' 处理对象:打印第三行
awk 'NR==3,NR==5{print}' 处理对象:打印第三行到第五行
方法1 awk 'NR==3;NR==5{print}' 处理对象:分别打印第三行和第五行
方法2 awk '(NR>=3)&&(NR>=5){print}' 处理对象:分别打印第三行和第五行
awk 'NR%2==0{print}' 处理对象 打印偶数行
awk 'NR%2==1{print}' 处理对象 打印奇数行
awk 'BEGIN{print 1+2}':加法
awk 'BEGIN{print 1.12+2.09}' :小数加法
方法1 awk 'BEGIN{print 2^3}':求幂的运算
方法2 awk 'BEGIN{print 2 * * 3}':求幂的运算
NR:行号
FS:列分割符,和F作用一致,如果要使用FS。格式:FS=" "
OFS:输出内容的分隔符
NF:表示最后一个字段
$n:也是属于内置变量