linux三剑客

bash

  • 命令行展开

echo wang{1..100} echo wang{1..100..2} 接两个数输出一次 bash能够识别{}

  • 命令别名

alias

unalias 不使用别名

  • 命令历史

!! 上一次的命令

  • 快捷键

ctrl+a 移动到行首

ctrl+e 移动到行尾

ctrl+u 删除光标之前的字符

ctrl+k 删除光标之后的字符

ctrl+l 清空屏幕终端内容,同于clear

基本正则与扩展正则表达式

正则表达式的意义

  • 处理大量的字符串
  • 处理文本
  • 配置文件
  • 程序代码
  • 命令输出结果
  • 日志文件
  • 正则表达式是一套规则和方法
  • 正则工作时以单位进行,一次处理一行
  • 正则表达式化繁为简,提高工作效率
  • linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用
  • 通配符是大部分普通命都支持的,用于查找文件或目录,而正则表达式是通过三剑客命令在文件中过滤的

Linux三剑客

文本处理工具,均支持正则表达式引擎

  • grep:文本过滤工具
  • sed:stream editor,流编辑器:文本编辑工具
  • awk:Linux的文本报告生成器(格式化文本),Linux上是gawk

正则表达式的分类

  • 基本正则表达式

BRE对应元字符有^$.[]*

  • 扩展正则表达式
  • ERE在BRE基础上,增加上(){} ?+ |等

基本正则表达式BRE集合

  • 匹配字符
  • 匹配字数
  • 位置锚定
^ 用于模式的最左侧,如“^wang”,匹配以wang开头的行
$ 用于模式的最右侧,如“wang$”,匹配以wang结尾的行
^$ 表示空行
. 匹配任意一个且只有一个字符,不能匹配空行
\ 让特殊含义的字符现出原形,\.代表小数点
* 匹配前一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容
.* 匹配所有内容
^.* 匹配任意多个字符开头的内容
.*$ 匹配任意多个字符结尾的内容
[] 匹配[]集合内的任意一个字符,a或b或c
[^abc] 匹配除了^后面的任意字符,^表示对[abc]的取反

扩展正则表达式ERE集合

扩展正则必须用 grep -E 才能生效

+ 匹配前一个字符1次或多次
[:/]+ 匹配括号内的“:”或“/”字符一次或多次
? 匹配前一个字符0次或1次
| 表示或者,同时过滤多个字符串
() 分组过滤,一个整体       grep -E "(l..e).*\1" wang.txt匹配l到e的所有内容
a{n,m} 匹配前一个字符最少n次,最多m次   grep -E "y{2,4}" wang.txt  匹配y最少2次,最多4次
a{n,} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配前一个字符最多m次

grep

文本搜索工具,过滤内容,对目标文本逐行进行匹配检查

模式:由正则表达式元字符及文本字所编写出的过滤条件

* grep [options] [pattern] file
命令  参数       匹配模式  文件数据
-i:ignorecase,忽略字符的大小写
-o:仅显示匹配到的字符串本身
-v,--invert-match:显示不能被模式匹配到的行
-E:支持使用扩展的正则表达式字符
-q,--quiet,--silent:静默模式,既不输出任何信息
-v:排除匹配的结果
-n:显示匹配的行号
-c:只匹配显示的行数
-w:只匹配过滤的单词

TIP

注意在Linux平台下,所有文件的结尾都有一个$符
  • ^符号

输出所有以m开头的行 grep -i -n ‘^m’ wang.txt

输出所有空行 grep -i -n ‘^$’ wang.txt

  • $符

输出所有以r结尾的行 grep -i -n ‘r$’ wang11

输出所有以.结尾的行 grep -n ‘\.$’ wang11 要用\,不然会被当做正则表达式使用

输出所有以r结尾的行,并用-o把root前面的内容过滤掉 grep -i -n ‘root$’ wang11 -o

把除了root$的内容输出 grep -i -n ‘root$’ wang11 -v

  • .符号

. 表示任意一个字符,有且只有一个,不包含空行

把所有行输出并标红 grep ‘.’ wang11

匹配s前面的一个字符 grep '.s' wang11

  • *符号

匹配i,找出i的0次或多次 pgrep ‘i*’ wang11

  • .*组合符

匹配所有的行内容 grep ‘.*’ wang11

匹配到e结尾 grep '.*e' wang11

  • []中括号

找出a-z所有的小写字母 grep ‘[a-z]’ wang11

找出所有的大写和数字 grep ‘[A-Z0-9]’ wang11

全文匹配 grep ‘[a-zA-Z0-5]’ wang11

找出除了^后面的行 grep ‘[^0-5]’ wang11

  • +号

匹配i一次或多次 grep -E ‘i+’ wang11

  • ?号

匹配i零次或一次 grep -E ‘go?d’ wang11 在goooooood god gd goood中只匹配god和gd

  • |符

或者的意思

在wang11中匹配i和l cat wang11 | grep -E ‘i|l’

匹配good和glad grep -E "g(oo|la)d" wang.txt

  • ()小括号

/1:表示从左侧起,第一个括号中的模式所匹配到的字符

/2:从左侧起,第二个括号中的模式所匹配到的字符

  • {}

匹配y最少2次,最多4次grep -E "y{2,4}" wang.txt

sed

是操作、过滤和转换文本内容的工具

语法:sed 选项 sed内置命令字符 输入文件

-n:取消默认sed的输出,常与命令p一起使用
-i:直接将修改结果写入文件,不用-i,sed修改的是内存数据
-e:多次编辑,不需要管道符
-r:支持正则扩展
a:append,对文本追加,在指定行后面添加一行/多行文本
d:delete,删除匹配行
i:insert,表示插入文本,在指定行前面添加一行/多行文本
p:print,打印匹配行的内容
s/正则/替换内容/g:匹配正则内容,然后替换内容,结尾g代表全局匹配
空地址:全文处理
单地址:指定文件某一行
/pettern/:被模式匹配到的每一行
范围区间:10,20 十到二十行 , 10,+5 第十行向下加五行 , /pattern/,/pattern/
步长:1~2,表示1,3,5,7,9行,2~3两个步长,表示2,4,6,8,10,偶数行
  • 输出文件第二三行的内容,不加-n会默认输出所有内容

sed “2,3p” wang11 -n 打印第二三行数据

sed “2,+3p” wang11 -n 打印第二行向下三行数据

  • 过滤出含有**的字符串行

sed “/school/p” wang11 -n 过滤含有school的行

  • 删除含有**的行,修改文件内容用-i

sed “/school/d” wang11 -n 删除含有school的行

sed “5,$d” wang11 -i 删除第五行到结尾

  • 文件中的替换

sed “s/你想要找到的内容/你想替换的内容/g” wang11

sed -e “s/fff/my/g” -e “s/yy/wang/g” wang11 -i 将fff替换为my,并且将yy替换为wang

  • 在文件行追加内容 a字符功能

sed "2a whoshi" wang11 -i 在第二行后面添加whoshi

sed “4i whoshiwo” wang11 -i 在第四行前面添加whoshiwo

  • 添加多行信息,用换行符“\n”

sed “3a i like c.\n i like py" -i 在第三行后面添加i...和i...并换行

  • 在每一行下面插入新内容

sed “a ------------” wang11 -i 在每一行下面添加----------

sed “i ------------” wang11 -i 在每一行上面添加----------

sed配合正则表达式的使用

  • 去头去尾法,只得到ip

ifconfig eth0 | sed "2p" -n | sed "s/^.*inet//" | sed “s/net.*$//” 取出ip地址,将IP地址前后内容删去

  • -e参数多次编辑

ifconfig eth0 | sed -e "2s/^.*inet//" -e "2s/net.*$//p" -n 取出ip地址,将IP地址前后内容删去

awk

适合文本格式化,对文本进行复杂处理

awk基础

awk [option] 'patten[action]' file ....
     可选参数  模式   动作      文件/数据
最常用的动作是print和printf

awk ‘{printf $1}’ wang11,表示输出文本的第二列信息

awk默认以空格为分隔符,且多个空格也识别为一个空格

awk是按行来处理的,一行处理完毕,处理下一行

$0表示整行,$NF表示当前分割后的最后一行,倒数第二行可以写成$(NF-1)

$n:指定分隔符后,当前记录的第n个字段
$0:完整的输入记录
FS:字段分隔符,默认是空格
NF(Number of fieids):分割后,当前行一共有多少个字段
NR(Number of records): 当前记录数,行数
  • 一次输出多行

输出1,2,5列,中间逗号代表空格 awk ‘{print $1,$2,$5}’ wang11

  • 自定义输出内容

awk,必须外层单引号,内层双引号 $1,$2不能加双引号,否则会识别为文本

awk '{print "第一列:" $1,"第二列:"$4,"第三列:"$5}' wang00

  • 输出整行信息

awk ‘{print}’ wang11

awk ‘{print $0}’ wang11

awk ‘{print "每一行的内容是:"$0}’ wang11

-F:指定分割字符段
-v:定义或修改一个awk内部的变量
-f:从脚本文件中读取awk命令
  • 显示第五行
NR在awk中表示行号,NR==5表示行号是5的那一行
一个等号是修改变量值的意思,两个等号是关系运算符,是等于的意思

输出第五行的所有内容awk 'NR==5{print $0}' wang00

  • 显示文件22的内容添加行号

添加变量,NR等于行号,$0表示一整行的内容

给每一行添加行号 awk ‘{print NR,$0}’ wang11

  • 显示3-5行且输出行号

awk 'NR==3,NR==5 {print NR,$0}' wang00

  • 显示wang00文件的第一列,倒数第二列和最后一列

awk ‘{print $1,$(NF-1),$(NF-2)}’ wang11

awk分隔符

输入分隔符,awk默认的是空格,空白字符,变量是FS
输出分隔符,简称OFS
  • FS输入分隔符

当没有空格时,可以指定分隔符,输出第一列 awk -F “:” ‘{print $1}’ wang11

输出第一列和最后一列 awk -F “:” ‘{print $1,$NF}’ wang11

还可使用变量的形式,使用-v,修改FS变量 awk -v FS= “:” ‘{print $1}’ wang11

  • OFS输出分隔符

wk -F ":" -v OFS="------" '{print $1,$NF}' wang00

wk -F ":" -v OFS="\t" '{print $1,$NF}' wang00

awk变量

  • awk参数
-F:指定分割字段符
-v:定义或修改一个awk内部的变量
-f:从脚本文件中读取awk命令
FS:输入字段分隔符,默认为空白字符
OFS:输出字段分隔符,默认为空白字符
RS:输入记录分隔符(输入换行符),指定输入时的换行符
ORS:输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
NF:当前行的字段的个数(即当前行被分割成了几列),字段数量
NR:行号,当前处理的文本行的行号
FNR:各文件分别计数的行号
FILENAME:当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数

awk -v FS=":" -v OFS="---" '{print NR,NF,$1}' wang11

内置变量

  • NR,NF,FNR
  1. awk的内置变量NR、NF不用添加$符号
  2. 而$0 $1 $2...需要添加$符号

输出每行行号,以及字段总个数 awk -v FS=":" '{print NR,NF,$1}' wang000

输出每行行号,以及指定的列 awk -v FS=":" ‘{print NR,$1,$列}’ wang11

  • 处理多个文件显示行号

不单独输出行号 awk '{print NR,$0}' wang11 wang00

单独输出行号 awk '{print FNR,$0}' wang11 wang00

  • RS

以每个空格作为换行符 awk -v RS='空格' '{print NR,$0}' wang00

  • 内置变量ORS

每行结束添加内容 awk -v ORS='-------chaoge666ya--------' '{print NR,$0}' wang00

  • 内置变量FILENAME

显示awk正在处理文件的名字 awk '{print FILENAME,$0}' wang00

  • 变量ARGC、ARGV

在开始输入内容 awk 'BEGIN{print "chaogekaishi"} {print $0}' wang00

awk 'BEGIN{print "chaogekaishi"} {print ARGV[0],$0}' wang00

awk 'BEGIN{print "chaogekaishi"} {print ARGV[1],$0}' wang00

awk 'BEGIN{print "chaogekaishi"} {print ARGV[0],ARGV[1],ARGV[2]}' wang0

awk 'BEGIN{print "chaogekaishi"} {print ARGV[0],ARGV[1],ARGV[2]}' wang00 wang000

  • 自定义变量

awk -v myname="wang" 'BEGIN{print "my name is?",myname}'

awk格式化输出

  • awk格式化

print,只能对文本简单的输出,并不能美化或修改格式

  • print格式化输出
  • printf和print的区别出

print会换行输出

printf不会换行输出

要点
其与print命令的最大不同是,printf需要指定format
format用于指定后面的每一个item的输出格式
printf语句不会自动打印换行符:\\n

format格式的指示符都以%开头,后跟一个字符
如下:
%c:显示字符的ASCII码
%d,%i:十进制整数
%e,%E:科学计数法显示数值
%f:显示浮点数
%g,%G:以科学计数法的格式或浮点数的格式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身

print修饰符:
-:左对齐,默认右对齐
+:显示数值符号
  • 给printf添加格式

格式化字符%s代表字符串的意思

awk '{printf "%s\n",$0}' wang22

printf '%s---\n' a b c d e

awk 'BEGIN{printf "%d\n%d\n%d\n%d\n",1,2,3,4}'

  • 对多个变量进行格式化

awk '{printf " 第一列:%s 第二列:%s 第三列:%s\n",$1,$2,$3}' wang00

  • 对文件格式化
‘BEGIN{printf “格式替换符 格式替换符”,“变量1”,“变量2”}’ 执行BEGIN模式

%s是格式替换符,替换字符串
%s\t 格式化字符串后,添加制表符,四个空格
%-25s 已然是格式化字符串,- 代表左对齐,25个字符长度
  • awk模式

BEGIN模式完成后,在对文件进行处理 awk 'BEGIN{print "CHf"}{print $0}' wang22

  • awk结合BEGIN和END模式

awk 'BEGIN{print "CHf"}{print $0}END{print "zjixingend"}' wang22

处理文本之前的操作 所有文本处理完毕,执行END命令

  • awk模式pattern

模式可以理解为条件

awk默认是按行处理文本,如果不指定任何模式(条件),awk默认一行行处理

如果指定了模式,只有符合模式的才会被处理

  • 模式(条件)案例
== 等于
!= 不等于
~ 匹配正则 x~/正则/
!~ 不匹配正则 x!~/正则/

打印wang22中第二行信息 awk 'NR==2{print $0}' wang22

awk 'NR==2{print}' wang22

awk 'NR==2' wang22

打印wang22中<4行的信息 awk 'NR<4{print $0}' wang22

不打印第三行的信息 awk 'NR!=3{print $0}' wang22

  • awk与正则表达式
正则表达式主要与awk的pattern模式结合使用
不指定模式,awk每一行都会执行对应的动作
指定了模式,只有被模式匹配到的、符合条件的行才会执行动作
  • 找出wang11中以game开头的行
grep ‘正则表达式’ wang11
awk ‘/正则表达式/动作’ wang11
  1. 用grep进行过滤 grep “game” wang11
  2. 用awk进行过滤 wak ‘/^game/{print $0}’ wang11
  • awk强大的格式化文本

awk -F ":" 'BEGIN{printf"%-20s\t%-30s\t%-20s\t%-20s\t\n","用户名","用户id","用户家目录","用户解释器"}{printf "%-30s\t%-30s\t%-30s\t%-30s\t\n",$1,$3,$6,$7}' wang000

  • awk的命令执行流程

awk ‘BEGIN(commands) pattern(commends) END(commends)’

优先执行BEGIN{}模式中的语句
从wang11文件中读取第一行,然后执行pattern(commends)进行正则匹配/n^/ 寻找n开头的行,找到了执行{print}进行打印
当awk读取到文件数据流的结尾时,会执行END{commends}
  • 找出wang11文件中禁止登陆的用户(/sbin/nologin)

正则表达式中如果出现了“/”则需要转义

  1. 用grep过滤 grep “/sbin/nologin” wang11
  2. awk用正则得用双斜杠 /正则表达式/ awk '/\/sbin\/nologin/{print NR,$0}' wang11
  • 找出文件的区间内容

找出wang11中第4到7行的内容 awk '/^mail/,/^ftp/{print NR,$0}' wang000

  • 统计日志的访客ip数量
sort -n 数字从大到小排序
wc -l 统计行数,ip的条目数
awk ‘{print $1}’ 500access.log | sort -n | uniq | wc -l
                                 排序      去重    统计行数
  • 查看访问最频繁的前10个ip
uniq -c 去重显示次数
sort -n 从大到小排序    
-r 反转参数
head -行数  从头取多少行
awk ‘{print $1}’ access.log | sort -n | uniq -c | sort -nr
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值