文章目录
1. grep
1.1 grep 简介
grep是一款文本过滤工具。根据用户指定的 “模式” 对目标文本逐行进行匹配检查,打印匹配到的行。,
1.2 正则表达式简介
正则表达式分为两类:
基本正则表达式:BRE
扩展正则表达式:ERE
1.2.1 基本正则表达式
字符匹配:
. :匹配任意单个字符
[] :匹配指定范围内的任意单个字符,如 [0-9] 表示匹配 0-9 的任意单个字符
[^] :匹配指定范围外的任意单个字符
以上[]当中还有以下几种表示方法:
[:alnum:] #表示所有的字母和数字
[:alpha:] #表示所有的字母(不区分大小写)
[:digit:] #表示所有的数字
[:lower:] #表示所有的小写字母
[:upper:] #表示所有的大写字母
[:punct:] #表示所有的标点符号
[:space:] #表示所有的空白字符
次数匹配:
用于在要指定次数的字符后面,用于指定前面的字符要出现的次数。
1. :匹配前面的字符任意次(0次1次或多次)
.* :任意长度的任意字符
\? :匹配前面的字符0次或1次
\+ :匹配前面的字符至少1次
\{m\} :匹配前面的字符m次
\{m,n\} :匹配前面的字符至少m次,至多n次
\{0,n\} :匹配前面的字符至多n次(0-n)
\{m,\} :匹配前面的字符至少m次(m-MAX)
位置锚定:
对特殊位置进行定位。
^ :行首锚定
$ :行尾锚定
^PATTERN$ :用于模式匹配整行,如 ^$ 表示空行
\< or \b :词首锚定
\> or \b :词尾锚定
\<PATTERN\> :匹配整个单词
1.2.2 扩展正则表达式
字符匹配:同基本正则表达式
次数匹配:
2. :匹配前面的字符任意次(0次1次或多次)
.* :任意长度的任意字符
? :匹配前面的字符0次或1次
| :或,如 cou(n|N)t
3. :匹配前面的字符至少1次
{m} :匹配前面的字符m次
{m,n} :匹配前面的字符至少m次,至多n次
{0,n} :匹配前面的字符至多n次(0-n)
{m,} :匹配前面的字符至少m次(m-MAX)
位置锚定:同基本正则表达式
1.3 grep 参数解析
语法:
grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
1. 默认参数: --color=auto
[root@study ~]# alias grep
alias grep='grep --color=auto' #对匹配到的文本高亮显示
2. -v 反向选择
grep -v "mail" grep.txt #不显示包含mail的行
3. -n 显示行号
grep -n "uucp" grep.txt #显示匹配到uucp的行号
4. -c 显示匹配的行数
grep -c "sbin" grep.txt #显示匹配到的总行数
5. -i 不区分大小写
grep -i "mail" grep.txt
6. -w 精确匹配
grep -w "bin" grep.txt #此时包含sbin的行不会被查找
grep "\<bin\>" grep.txt #效果同上
7. -o 仅显示匹配到的字符串本身
grep -o "mail" grep.txt #仅显示匹配到的mail
8. -q 静默模式
grep -q "mail" grep.txt #无输出,用于$?判断
9. -A :after,除了显示匹配行,还会显示该行下面的内容
grep -A 1 "mail" grep.txt #标准输出查找到的行及其下一行
10. -B :before,除了显示匹配行,还会显示该行上面的内容
grep -B 1 "mail" grep.txt #标准输出查找到的行及其上一行
11. -C :-A和-B同时显示
grep -C 1 "mail" grep.txt #显示匹配行及其上下一行
12. -E 支持扩展正则表达式
grep -E 同 egrep
1.4 grep 实例解析
1. 显示 /proc/meminfo 文件中以大写S或小写s开头的行。
grep -i '^s' /proc/meminfo
grep '^[Ss]' /proc/meminfo
grep -E '^(S|s)' /proc/meminfo
2. 显示 /etc/passwd 文件中其默认shell为非 /sbin/nologin 的用户。
grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
3. 显示/etc/passwd 文件中默认 shell 为/bin/bash 的用户,且仅显示ID号最大的用户。
grep "/bin/bash$" /etc/passwd | sort -t: -k3 -nr | head -1 | cut -d: -f1
4. 找出/etc/passwd文件中的一位数或者两位数。
grep "\<[0-9][0-9]\?\>" /etc/passwd
grep -E "\<[0-9][0-9]?\>" /etc/passwd
grep -E "\<[0-9]{1,2}\>" /etc/passwd
5. 找出ifconfig命令中的所有ip地址。
ifconfig | grep -o -E "([0-9]\.|[1-9][0-9]\.|1[0-9][0-9]\.|2[0-9][0-9]\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-9]{2})"
6. 找出/etc/rc.d/init.d/functions 文件中某单词后跟一组"()"的行。
grep -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions
2. sed
2.1 sed 简介
sed是一种在线编辑器、行编辑器,一次处理一行内容,在处理时把当前处理的行存储在临时缓冲区当中,该缓冲区成为"模式空间(pattern space)",接着用sed命令处理缓冲区中的内容。处理完毕后,将缓冲区的内容送到标准输出,然后接着去处理下一行,重复完成相同的操作,直至文件末尾。sed处理的整个过程中,对象文件中的内容并没有改变,除非使用重定向来存储处理后的结果。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作过程。
2.2 sed 参数解析
语法:
sed [OPTION]… {script-only-if-no-other-script} [input-file]…
1. -r 支持扩展正则表达式
sed默认支持基本正则表达式,-r 支持扩展正则表达式
2. -n 静默模式
sed -n '1p' sed.txt #只会输出sed.txt的第一行;默认会将匹配的行先输出,然后将全文输出
3. -e 多个命令组合,对文件内容执行多条sed命令条件
sed -ne '1p' -e '3p' sed.txt #只输出sed.txt的第一行和第三行
4. -f /PATH/SCRIPT_FILE 从指定的文件中读取脚本并运行
5. -i 把sed命令修改的结果直接写入到文件,一般用来编辑文件内指定内容,屏幕不输出内容
sed -i '/bash/s/bin/sbin/g' sed.txt #将文件中匹配到 bash 的行中的 bin 字符全部换为 sbin
6. a:add 在匹配的当前行的下一行添加内容
sed '/hello/aworld' sed.txt #在匹配带hello行的下一行添加world
7. i:insert 在匹配的当前行的上一行添加内容
sed '/hello/iworld' sed.txt #在匹配带hello行的上一行添加world
8. &:在当前行匹配字符串尾添加字符串
sed 's/world/&world/' sed.txt #在匹配到 hello 的尾部添加world
9. c:把该行替换成c后面的字符串
sed '2,4c hello world' sed.txt #2-4行的全部内容替换成"hello world"一行
10. s:旧字符替换新字符,行数s/旧字符串/新字符串/g;s///,s###,s@@@
sed 's/than/hello/' sed.txt #将每行匹配到的第一个 than 换为 hello
sed 's/than/hello/g' sed.txt #将每行匹配到的所有 than 换为 hello
sed '2s/than/hahaha/' sed.txt #匹配第二行
sed '2,4s/than/hahaha/' sed.txt #匹配第二行到第四行
sed '/by/s/^/hello/' sed.txt #在包含by行的头加上hello
sed '/Beautiful/s/than/hahaxha/' sed.txt #在匹配到有Beautiful的行,第一个than换位hahaha
sed '/Beautiful/s/than/hahahah/g' sed.txt #在匹配到有Beautiful的行,所有than换位hahaha
11. p:标准输出
sed -n '1,3p' sed.txt #显示1-3行的内容
sed -n '2p;$p' sed.txt #显示第二行和最后一行的内容,中间用分号隔开,多行可以sed -n '2p;3p;$p' sed
12. d:删除
sed '1d' sed.txt #删除第1行
sed '2,3d' sed.txt #删除第2-3行
sed '2d;$d' sed.txt #删除第2行和最后1行
13. w /PATH/FILE:将指定的内容另存至 /PATH/FILE所指定的文件中
sed -n '1,5w sed.txt' test.txt #将sed.txt中的1-5行另存至test.txt文件中
14. 特殊用法
sed -n '1~2{cmd}' #1、3、5、7 ...行执行cmd命令
sed -n '2~2{cmd}' #2、4、6、8 ...行执行cmd命令
sed '1,+10{cmd}' #1-11行执行cmd命令
2.3 sed 实例解析
1. 删除 /tmp/grub.conf 文件中所有行的行首的空白字符。
sed 's#^[[:space:]]\+##' /tmp/grub.conf
2. 删除 /etc/fstab 文件中所有以#号开头,且至少跟有一个空白字符的行的行首的#号和空白字符。
sed 's@^#[[:space:]]\+@@' /etc/fstab
sed -r 's@^#[[:space:]]+@@' /etc/fstab
3. 把 /etc/fstab 文件的奇数行另存为 /tmp/test.txt。
sed -n '1~3w /etc/test.txt' /tmp/fstab
3. awk
3.1 awk简介
Linux文本处理工具三剑客:grep、sed、awk。其中grep是文本过滤工具,sed是文本行编辑器,而awk是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件内容进行各种"排版",进而格式化显示。
在Linux上我们使用的是GNU awk 简称 gawk,gawk 其实就是 awk 的链接文件,因此在系统上使用 awk 和 gawk是一样的。gawk是一种过程式编程语言。gawk还支持条件判断、数组、循环等各种编程语言中所有可以使用的语言,因此我们还可以把 gawk 称为一种脚本语言解释器。
3.2 awk 参数解析
语法:
awk [OPTIONS] ‘program’ FILE1 …
1. $0,$1/$2…
$0: #显示所有内容
$1/$2.../$n #分别代表当前行的第一列/第二列/第三列…/第n列字段
2. -F
指定分隔符,默认是空格或[TAB]
3. 变量
变量分为内建变量和自定义变量。
内置变量:
FS :输出字段分隔符,默认为空白。如:-v FS=[:] 同 -F:
RS :输入时的行分隔符,默认为换行符。
OFS :输出时的字段分隔符,默认为空白字符。如:awk 'BEGIN{FS=":";OFS=":"}{print $3,$4}' /etc/passwd
ORS :输出的行分隔符,默认为换行符。
NF :当前行的字段数。
print NF :显示当前行的字段数
print $NF : 显示当前行的最后一个字段
NR :文件行数
FNR :行数,各文件单独计数
自定义变量:
(1) -v VAR_VALUE=VALUE 变量名区分大小写
如:awk -F: -v val="1" '{print $val}' /etc/passwd
(2) 在'program'中定义变量
如:awk 'BEGIN{FS=":";num=3}{print $num}' /etc/passwd
4. print:awk的输出命令之一
语法:print item1,item2,...
item:字符串,用引号引用
print "hello","world"
变量:显示变量的值,可以直接使用变量名进行引用
print var_name**
实例:
awk '{print}' awk.txt #输出整行
awk '{print $0}' awk.txt #输出整行
awk '{print $1,$3}' awk.txt #输出每行的第1和第3个字段,每个字段需用","隔开
awk -F: '{print $NF}' /etc/passwd #以":"为分隔符,输出/etc/passwd最后一个字段
注意:
(1) 各item之间需要使用逗号分隔,而输出时的分隔符默认为空白字符。
(2) 输出的各 item 可以为字符串或数值、当前记录的字段($#)、变量或awk的表达式。数值会被隐式转换为字符串进行输出。
(3) print 后面的item 有省略时,相当于运行"print $0",用于输出整行。
(4) 输出空白字符:print " " 。
5. printf:awk的输出命令之二
语法:printf FORMAT,item1,item2,...
要点:
(1) 必须提供FORMAT
(2) 与print不同,printf不会自动换行,需要显示指定换行符:\n
(3) FORMAT 中需要额分别为后面的每个item指定一个格式符,否则item无法显示
格式符:
%c :显示一个字符
%d,%i:显示为10进制整数
%f :显示为浮点数
%s :显示为字符串
%u :显示无符号整数
%% :显示%
实例:
awk -F: '{printf "user:%s\n",$1}' /etc/passwd #输出第一列,且在输出前加上user:
awk -F: '{printf "user:%s,UID:%d\n",$1,$3}' /etc/passwd
6. awk的操作符
算数操作符:实现一些算数运算,如:x+y,x-y,x*y,x/y,x^y,x%y
-x:负值
+x:转换为数值
字符操作符:字符串连接
赋值操作符:通常为变量的赋值
=,+=,-=,*=,/=,%=,^=,++,--
比较操作符:
>,>=,<,<=,==,!=
模式匹配操作符:根据右侧的模式进行匹配操作
~ :是否能由右侧指定的模式所匹配
!~ :是否不能由右侧指定的模式所匹配
逻辑操作符:
&&:与运算
||:或运算
条件表达式:
selector?if-true-expression:if-false-expression
7. PATTERN模式
选择对哪些内容进行处理。
(1) empty :空模式,匹配所有行,默认为此模式
(2) /regular expression/:匹配到的行才进行操作
如:awk -F: '/^[ab]/{prin $1}' /etc/passwd #以ab开头的行才被处理
(3) relationl expression:关系表达式
如:awk -F: '$3>=1000{print $1}' /etc/passwd #uid大于1000的行才被处理
(4) BEGIN/END:两个特殊模式
BEGIN:在文件格式化操作开始之前事先执行的一次操作,通常用于输出表头或作出一个预处理操作。
END:在文件格式操作完成之后,命令退出之前执行的一次操作,通常用于输出表尾或做出清理操作。
8. 控制语句
if-else:
语法:if(condition) {statements} [else {statements}]
实例:
awk -F: '{if($3>=1000) print $1}' /etc/passwd
awk -F: '{if($3>=1000) {print $1,"is a common user."} else {print $1,"is a sysadmin or sysuser."}}' /etc/passwd
while:
语法:while (condition) {statements}
实例:
awk '{i=1;while(i<=NF){if(length($1)>=6) {print $i};i++}}' /etc/issue
for:
语法:
for(expr1;expr2;expr3) {statement}
for(var in array) {for-body}
实例:
awk '{for(i=1;i<=NF;i++) {if(length($i)>=6) print $i}}' /etc/issue
9. 数组
关联数组:array[index-expression]
index-expression:可以使用任意字符
10. 函数
函数分为内建函数和用户自定义函数
内建函数:
rand() :返回0至1之间的一个随机数
length([s]) :返回指定的字符串的长度
sub(r,s[,t]):基于r所表示的模式来匹配字符串t中的内容,将其第一次被匹配到的内容替换为s所表示的字符串
gsub(r,s[,t]):基于r所表示的模式来匹配字符串t中的内容,将其所有被匹配到的内容替换为s所表示的字符串
split(s,a[,r]):以r为分隔符去切割字符串s,并将切割后的结果保存至a表示的数组中
注:awk数组的下表从1开始编号,而非0.
3.3 awk实例解析
1. 统计当前系统上所有tcp连接的各种状态的个数。
ss -tan | awk '!/^State/{state[$1]++}END{for(i in state) print i,state[i]}'
2. 统计指定的web访问日志中各ip的资源访问次数。
awk '{ip[$1]++}END{for(addr in ip) print addr,ip[addr]}' /var/log/httpd/access_log
4. 脚本常用命令
4.1 find
语法:find 查找目录 -[OPTIONS] [-print] [-exec -ok command] {} \;
1. -name
find . -name four #查找名为four的文件(包括目录和文件)
find . -name "fou*" #查找开头是fou的文件
find . -name "[A-Z]*" #查找大写字母开头的文件
find . -name "*.txt" #查找以.txt结尾的文件
2. -user
find . -user lee #查找属主为lee的文件
3. -group
find . -group lee #查找属组为lee的文件
4. -type
find . -type d #查找文件类型为目录的文件,除了d,还有f,b,c,p,l,s,分别指普通文件,块设备,字符设备,管道,链接文件和socket套接字
find . ! -type f #查找非普通文件的文件,符号!表示反向选择
5. -size
find . -size 10M #查找大小大于10M的文件,+n表示大于nM的文件,-n表示大小小于nM的文件
6. -perm
find . -perm 600 #查找执行权限为600的文件
find . -perm -007 #查找777权限的文件,与-perm 777一样效果,+222表示文件权限在222以上
7. -mtime -atime -ctime
find . -mtime 2 #查找文件内容修改在两天前的文件,n代表n天前的当天,-n代表n天以内,+n代表n天以前
find . -atime 2 #查找2天前被访问过的文件,n表示n天前当天被访问过,-n表示n天以内被访问过,+n表示n天以前被访问过的
find . -ctime +4 #查找4天以前文件状态被修改的文件,比如改了文件权限等,-n表示n天以内文件状态有变过,+n表示n天以前文件状态被改
-mmin/-amin/-cmin与上面类似,只是单位变成了分钟
8. -maxdepth 只在当前文件夹这一级来搜索,而不去递归向下搜索
find . -maxdepth 1 -name four #在当前目录下找名为four的,不去子目录下找
find . -maxdepth 1 -type f #注意maxdepth的位置要在前面
find . -maxdepth 1 -size +100M -exec ls -lh {} \; #找到文件并执行 ls -lh
9. -a、-o、-not、!
find . -name "four*" -a -type d #同时满足
10. -exec表示对搜索到的每个文件执行指定的命令,-ok 需要有用户进行确认
{} #表示搜索到的每个文件
\; #表示命令的结束,为避免转义故在;前加符号\
find . -name "*.txt" -type f -exec cp {} /tmp \; #查找.txt结尾的普通文件并复制到tmp目录下
find . -name "[A-Z]*" | xargs chmod 600 -R #查找大写字母开头的文件及子文件并把权限设置为600.
注:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性的 传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方法可避免此问题
find | xargs COMMAND
4.2 wc
语法:wc [OPTION]… [FILE]…
-l :统计行数
-w :统计单词数
-c :统计字节数
4.3 cut
语法:cut OPTION… [FILE]…
-d:默认空格为分隔符,可指定
-f:挑选出的字段
1 第一个字段
1-3 123字段
1,5 15字段
4.4 sort
-t:指定分隔符,默认排第一列字符排序
-k:用于排序的字段
-n:基于数值大小进行排序
-r:逆序排序
-f:忽略字符大小写
-u:重复的行只保留一份
4.5 uniq
-c:对重复的行计数
-u:只显示未重复的行
-d:只显示重复的行
这篇文章就介绍到这里了,本人运维小菜鸟一枚,有什么错误请大家指出,共同进步。