一、bash
- bash是什么
- bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令
- bash还能从文件中读取linux命令,称之为脚本
- bash支持通配符、管道、命令替换、条件判断等逻辑控制语句
- bash的特性
- 打印输出
- 命令别名
- 命令历史
- 快捷键
- 命令补全 ```python [root@ylinux data_12_12]# echo ylin{1..10} #打印输出 ylin1 ylin2 ylin3 ylin4 ylin5 ylin6 ylin7 ylin8 ylin9 ylin10 [root@ylinux data_12_12]# echo ylin{1..10..3} #按照第三位数字进行步长打印 ylin1 ylin4 ylin7 ylin10
[root@ylinux data_12_12]# alias rm=’echo 你真的不能这么做rm’ #别名打印输出,这里修改时注意空格的报错
[root@ylinux data_12_12]# unalias rm #删掉某一个别名
```python!! #执行上一次执行的命令 #快捷神器ctrl + a/e/u/k/l #移动到行首/行尾/删除光标之前的字符/之后的字符/清屏
二、正则表达式
- 分类
- 基本的正则表达式 BRE 对应元字符有^ $ . [ ] *
- 扩展的正则表示 ERE 在BRE的基础上增加了( ) { } ? + |
- 意义
- 处理字符串、文本
- 过滤、替换
- 操作
需要结合sed、grep、awk进行操作
通配符是大部分普通命令都支持的,用于查找文件或目录,而正则表示式是通过三剑客命令在文件数据流中过滤信息的。
^ 用户模式的最左侧,匹配以什么开头的行$ 用于模式的最右侧,表示以什么结尾的行^$ 组合符,表示空行. 组合出现表示:匹配任意一个且有只有一个字符,单独出现表示:不能匹配空行\ 转义字符,让特殊含义的字符,现出原形,还原本意,如\.代表小数点* 匹配一个字符(连续出现)多次,重复0次代表空,匹配所有内容.* 组合符,匹配任意长度的任意字符^.* 组合符,匹配任意多个字符开头的内容.*$ 组合符,匹配以任意多个字符结尾的内容[abc] 匹配[]集合内的任意一个字符[^abc] 匹配除了^后面的任意字符
扩展的正则表达式必须用grep -E才能生效+ 匹配到当前一个字符1次或者多次,前面一个字符至少出现1次[:/]+ 匹配括号内的.或者/字符一次或者多次? 匹配前一个字符0次或者1次,前面字符可有可无| 表示或者,同时匹配多个字符串() 分组过滤,被括起来的内容表示一个整体a{n,m} 匹配前一个字符最少n次,最多m次
[root@ylinux opt]# grep -i -n '^m' luffy.txt #以m开头的行,-i 忽略大小写,-n 显示行号5:my qq is 1107:my name is ylin[root@ylinux opt]# grep -i -n 'r$' luffy.txt #以r结尾的行1:i am oldboy teacher[root@ylinux opt]# grep -i -n '\.$' luffy.txt #显示以.结尾的行,特殊符号需要添加转义字符15:lin.[root@ylinux opt]# grep -n '^$' luffy.txt #显示空行,并显示行号4:[root@ylinux opt]# grep -n '^.y' luffy.txt #匹配5:my qq is 1107:my name is ylin[root@ylinux opt]# grep -n '.*' luffy.txt #匹配任意
三、grep
- 作用 文本搜索工具,根据用户指定的过滤条件对目标文本逐行进行匹配检查,打印匹配到的行
- 模式 由正则表达式的 元字符 以及 文本字符 所编写出的过滤条件
```python [root@ylinux data_12_12]# grep -i ‘root’ pwd.txt #匹配带有root的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin语法:grep [options] [pattern] file命令 参数 匹配模式 文件数据-i:ignorecase,忽略字符的大小写;-o:仅显示匹配到的字符串本身;-v, --invert-match:显示不能被模式匹配到的行;-E:支持使用扩展的正则表达式元字符;-q, --quiet, --silent:静默模式,即不输出任何信息;-n 显示行号-c 只统计匹配到的行-w 只匹配过滤的单词-o 只输出匹配的内容
[root@ylinux data_12_12]# grep -n -c “root” pwd.txt #匹配统计到的行 2
[root@ylinux data_12_12]# grep -n ‘^$’ pwd.txt #匹配显示的空行
[root@ylinux opt]# grep -n ‘.*’ luffy.txt #匹配所有,包含空行,但是.匹配不到空行,能匹配非空行所有内容
[root@ylinux opt]# grep -n ‘n.*e’ luffy.txt #贪婪匹配,匹配n开头、e结尾的单词的行 7:my name is ylin
[root@ylinux opt]# grep -n [na] luffy.txt #匹配[]中的任意一个字符,如果是[^na]表示匹配非na的字母 1:i am oldboy teacher 2:i teach linux
[root@ylinux opt]# grep -n -o [na] luffy.txt |wc -l #只匹配输出的内容,-0 参数,然后在统计一把 9
```python[root@ylinux opt]# grep -n -i -E 'l+' luffy.txt #扩展的正则表达式,-E必须要加;+匹配前一个字符一次或者多次[root@ylinux opt]# grep -E -n 'go?d' luffy.txt #匹配前面一个字符出现一次或者零次21:god[root@ylinux opt]# grep -E -n 'l|M' luffy.txt #匹配l或者m出现的行[root@ylinux opt]# grep -E -n 'g(oo|la)d' luffy.txt #分组过滤20:good22:good24:glad[root@ylinux opt]# grep -n -E '(root).*\1' /etc/passwd #匹配root开始和root结尾的中间不管包含什么1:root:x:0:0:root:/root:/bin/bash
[root@ylinux opt]# grep -E '^(root|www)\>' /etc/passwd #匹配root或者www的用户组信息root:x:0:0:root:/root:/bin/bashwww:x:1507:1507::/home/www:/bin/bash[root@ylinux opt]# grep -E '\<[0-9]{2}\>' /etc/passwd #匹配用户组ID中为两位或者是三位的信息,\>右边闭合 \<左边闭合[root@ylinux opt]# grep '^[[:space:]].*' love.txt #只匹配首行有一个空的行I ikei xx[root@ylinux opt]# grep -E '^([^:]+\>).*\1$' /etc/passwd #匹配一个用户已什么开头什么结尾的,,[^:]代表的一串字母sync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltbash:x:1508:1508::/home/bash:/bin/bash
四、sed
sed是stream editor (字符流编辑器)的缩写,检查流编辑器
sed是操作、过滤和转换文本内容的强大工具
常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能就是过滤(过滤指定字符串)、取行(取出指定行)
处理流程:将文本文件按行读入到sed的模式空间中,处理内容数据;
根据规则对每行数据进行处理,
如果能匹配中规则就按照规则进行编辑处理在输出
如果不能匹配到规则就直接原行输出
sed [选项] [sed内置命令字符] [输入文件]
选项参数:- n 取消默认的sed输出
- i 直接写入文件,如果不使用-i,sed修改的就是内存中的数据
- e 多次编辑,就不需要管道符啦
- r 支持正则表达式
内置命令字符:
a append 对文本进行追加
d delete 对文本进行删除
i insert 对文本进行插入
p print 对文本进行打印
s/正则/g 匹配正则表达式内容进行全局替换
[root@ylinux opt]# sed '1,2p' 1.txt #误区,sed默认是输出所有的工作原理 需要加上-n 不显示默认输出
My name is chaoge.
My name is chaoge.
I teach linux.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://pythonav.cn.
[root@ylinux opt]# sed '/linux/p' 1.txt -n #匹配某一个字符并打印
I teach linux.
[root@ylinux opt]# sed '/game/d' 1.txt #此时修改的只是内存中的数据,如果加上-n你还啥都看不见,因为删除了
My name is chaoge.
I teach linux.
My qq is 877348180.
My website is http://pythonav.cn.
[root@ylinux opt]# sed '4,$d' 1.txt -i #删除4到末行内容并且-i直接生效写入文件
[root@ylinux opt]# sed 's/My/ylin/g' 1.txt #替换My为ylin
ylin name is chaoge.
I teach linux.
ylin qq is 877348180.
[root@ylinux opt]# sed '3a wo live linux' 1.txt #在第三行下面添加一行,如果是在上面添加则是i,如果是每一行都添加则是a,如果添加多行内容则是\n
[root@ylinux opt]# ifconfig virbr0 |sed -ne '2s/^.*inet//g' -e '2s/net.*$//gp' #取出网卡的ip地址
192.168.122.1
[root@ylinux opt]# sed '/^$/d;/^#/d' loves.txt #删除空白的行和注释的行
I like my lover.
I love my lover.
He likes his lovers.
He loves his lovers.
五、awk
1、文本格式输出利器
awk [option] 'pattern[action]' file ...
awk 参数 '条件动作' 文件
AWK内置变量:
$n 指定分隔符后,当前记录的第n个字符
$0 完整的输入记录
FS 字段分隔符,默认是空格
NF 分割后,当前行一共有多少个字段
NR 当前记录数,行数
[root@ylinux opt]# awk '{print $1,$2}' ylin.txt #输出1,2行的内容
alex1 alex2
alex6 alex7
[root@ylinux opt]# awk '{print "x",$1,"xx",$2}' ylin.txt #在第一行和第二行打印的头部添加参数
x alex1 xx alex2
x alex6 xx alex7
[root@ylinux opt]# awk '{print}' ylin.txt #打印整行信息, awk '{print $0}'
[root@ylinux opt]# awk 'NR==5' pwd.txt #只显示第五行信息 NR==2,NR==5 第二到五行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@ylinux opt]# awk -F ':' '{print $1,$(NF-1)}' pwd.txt #-F以什么为分隔条件,打印1行和最后一行(NF-1)
2、变量
-F 指定分隔符
-v 定义或者修改内部变量
-f 从脚本中读取awk命令
FS 输入分隔符,默认为空白字符
OFS 输出分隔符,默认为空白字符
RS 输入记录分隔符,默认为空白字符
ORS 输出记录分隔符,输出时用符号代替换行符
NR 行号
NF 列号
FNR
[root@ylinux opt]# awk -F ':' 'NR==1{print $1,$2}' pwd.txt #输入分隔符,按照什么条件进行匹配
root x
[root@ylinux opt]# awk -F ':' -v OFS='----' '{print $1,$2}' pwd.txt #输出分隔符,通过前面的OFS匹配后面的逗号的值
root----x
[root@ylin ~]# awk '!/^$/' chaoge.txt > chaoge1.txt #awk本身不修改文件内容需要写入重定向
[root@ylin ~]#
[root@ylin ~]# cat chaoge1.txt
lkjsdljf
ljl
lkjljl
$111lkjl1
format的使用
要点:
1、其与print命令的最大不同是,printf需要指定format;
2、format用于指定后面的每个item的输出格式;
3、printf语句不会自动打印换行符;\\n
format格式的指示符都以%开头,后跟一个字符;如下:
%c: 显示字符的ASCII码;
%d, %i:十进制整数;
%e, %E:科学计数法显示数值;
%f: 显示浮点数;
%g, %G: 以科学计数法的格式或浮点数的格式显示数值;
%s: 显示字符串;
%u: 无符号整数;
%%: 显示%自身;
printf修饰符:
-: 左对齐;默认右对齐,
+:显示数值符号; printf "%+d"
