目录
Linux三剑客
1.管道
Linux提供管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入
示例:echo “hello123” | grep ‘hello’
正则表达式:
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
常用的限定符
* 重发零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,m} 重复n到m次
{n,} 重复n次或更多次
2.grep
根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
2.1命令
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 输出同时显示行号
-c 统计匹配的行数
-a :将 binary 文件以 text 文件的方式搜寻数据
-o 仅显示匹配到的字符串
-E 使用ERE,相当于egrep
^* 以*开发
^$ 空白行
*$ 以*结尾
pattern正则表达式:
基本表达式:
- ^开头$结尾
- [a-z][0-9]区间
- *0个或多个
基本正则(BRE)与扩展正则区别(ERE)
- ?非贪婪匹配 重复零次或者一次
- +重复一个或者多个
- ()分组
- {}范围约束 {n}重复n次 {n,}重复n次或更多次 {n,m}重复n到m次
- |匹配多个表达式的任何一个 表示或
2.2实例
-o显示指定内容
echo "1234 5674 7654" | grep -o "[0-9]4"
34
74
54
E扩展
lulu@ubuntu:~$ echo "1234 5674 7654" | grep -o "[0-9]4|76"
没有输出结果
lulu@ubuntu:~$ echo "1234 5674 7654" | grep -oE "[0-9]4|76"
34
74
76
54
使用vim修改一个grep.txt
Hello World
Hello Insert
Hello p
E
World
good
123334
46*&%
grep使用-a查看
lulu@ubuntu:~/Desktop/Test$ cat grep.txt |grep -a "Hello"
Hello World
Hello Insert
Hello p
直接查找符合条件的行(显示行号)
lulu@ubuntu:~/Desktop/Test$ grep -n hello grep.txt
查找反向符合条件的行
lulu@ubuntu:~/Desktop/Test$ grep -v hello grep.txt
Hello World
Hello Insert
Hello p
E
World
good
123334
46*&%
直接查找符合条件的行数
lulu@ubuntu:~/Desktop/Test$ grep -c hello grep.txt
0
忽略大小写查找符合条件的行数
lulu@ubuntu:~/Desktop/Test$ grep -i hello grep.txt
Hello World
Hello Insert
Hello p
查找结尾是呢的行
lulu@ubuntu:~/Desktop/Test$ grep -n "World$" grep.txt
1:Hello World
5:World
查看开头的行
lulu@ubuntu:~/Desktop/Test$ grep -n "^H" grep.txt
1:Hello World
2:Hello Insert
3:Hello p
颜色设置,可以在 ~/.bashrc 内加上这行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』来立即生效即可
grep --color=auto
在当前目录新建一个文件sed.txt
lulu@ubuntu:~/Desktop/Test$ ls -l
总用量 8
-rw-r--r-- 1 lulu lulu 59 9月 29 19:00 grep.txt
-rw-r--r-- 1 lulu lulu 55 9月 29 19:10 sed.txt
在当前目录搜索带'Hello'行的文件
lulu@ubuntu:~/Desktop/Test$ grep 'Hello' *
grep.txt:Hello World
grep.txt:Hello Insert
grep.txt:Hello p
在当前目录及其子目录下搜索'Hello'行的文件会显示Hello
lulu@ubuntu:~/Desktop/Test$ grep -r 'Hello' *
grep.txt:Hello World
grep.txt:Hello Insert
grep.txt:Hello p
在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件
lulu@ubuntu:~/Desktop/Test$ grep -l -r 'Hello' *
grep.txt
匹配搜索
lulu@ubuntu:~/Desktop/Test$ grep -n 'H[ea]llo' grep.txt
1:Hello World
2:Hello Insert
3:Hello p
11:Hallo
^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表以*开头与
反向取值:
lulu@ubuntu:~/Desktop/Test$ grep -n '[^a-z]' grep.txt
1:Hello World
2:Hello Insert
3:Hello p
4:E
5:World
7:123334
8:46*&
9:%
10:HAllo
11:Hallo
以字母a-z开头
lulu@ubuntu:~/Desktop/Test$ grep -n '^[a-z]' grep.txt
6:good
-v反向取值
lulu@ubuntu:~/Desktop/Test$ grep -v '^[a-z]' grep.txt
Hello World
Hello Insert
Hello p
E
World
123334
46*&
%
HAllo
Hallo
空白行
lulu@ubuntu:~/Desktop/Test$ grep -n '^$' grep.txt
12:
13:
2.3正则匹配
. (小数点):代表『一定有一个任意字节』;* (星号):代表『重复前一个字符, 0 到无穷多次』的意思
查找g开头d结束的中间还两个字符
lulu@ubuntu:~/Desktop/Test$ grep -n 'g..d' grep.txt
6:good
16:good
lulu@ubuntu:~/Desktop/Test$ grep -n 'goo*d' grep.txt
6:good
15:god
16:good
17:gooooood
lulu@ubuntu:~/Desktop/Test$ grep -n 'go\{1,\}d' grep.txt
6:good
15:god
16:good
17:gooooood
g开头d结尾
lulu@ubuntu:~/Desktop/Test$ grep -n 'g.*d' grep.txt
6:good
15:god
16:good
17:gooooood
找出『任意数字』开头的行
lulu@ubuntu:~/Desktop/Test$ grep -n '[0-9][0-9]*' grep.txt
7:123334
8:46*&
查找两个到5个的o,{}需要转义
lulu@ubuntu:~/Desktop/Test$ grep -n 'go\{2,5\}d' grep.txt
6:good
16:good
3.awk
awk比起sed和grep,awk不仅仅是一个小工具,也可以算得上一种小型的编程语言了,支持if判断分支和while循环语句还有它的内置函数等,是一个要比grep和sed更强大的文本处理工具。
awk处理过程: 依次对每一行进行处理,然后输出
RS 行记录分隔符
FS记录分隔符
NR记录数
NF字段数
BEGIN END
3.1基本用法
输出打印内容
lulu@ubuntu:~/Desktop/Test$ echo 'this is a test' | awk '{print $0}'
this is a test
vim编辑 students_store
姓名: 语文: 数学: 英语: 化学: 物理: 生物: 总分
xiaoming : 124: 123 : 90: 90: 100: 90: 890
张三 : 123: 78: 90 : 79 : 76: 98: 789
张三 : 123 : 78 : 90 : 79 : 76 : 98 : 789
打印students_store 全部内容
lulu@ubuntu:~/Desktop/Test$ awk '{print $0}' students_store
姓名: 语文: 数学: 英语: 化学: 物理: 生物: 总分
xiaoming : 124: 123 : 90: 90: 100: 90: 890
张三 : 123: 78: 90 : 79 : 76: 98: 789
张三 : 123 : 78 : 90 : 79 : 76 : 98 : 789
输出第一列
lulu@ubuntu:~/Desktop/Test$ awk '{print $1}' students_store
姓名:
xiaoming
张三
张三
—F设置适合的分隔符
lulu@ubuntu:~/Desktop/Test$ awk -F ':' '{ print $1 }' students_store
姓名
xiaoming
张三
张三
提取第二列
lulu@ubuntu:~/Desktop/Test$ awk -F ':' '{ print $2 }' students_store
语文
124
123
123
提取全部
lulu@ubuntu:~/Desktop/Test$ awk -F ':' '{ print $0}' students_store
姓名: 语文: 数学: 英语: 化学: 物理: 生物: 总分
xiaoming : 124: 123 : 90: 90: 100: 90: 890
张三 : 123: 78: 90 : 79 : 76: 98: 789
张三 : 123 : 78 : 90 : 79 : 76 : 98 : 789
lulu@ubuntu:~/Desktop/Test$ awk -F ':' '{print $1, ($NF-1)}' students_store
姓名 -1
xiaoming 889
张三 788
张三 788
lulu@ubuntu:~/Desktop/Test$ awk -F ':' '{print $1, ($NF-1)}' students_store
姓名 -1
xiaoming 889
张三 788
张三 788
模式与动作:
awk '{[pattern] action}' {filenames}
给文件加入标题头
awk 'BEGIN {print "Name Math Chinese English History Sport grade\n----------------------------------------------"} {print $0}' students_store
分列打印:
awk 'BEGIN {print "Name Math grade\n---------------------"} {print $1 2 "\t" $7} END {print "continue to exert oneself"}' students_store
变量:
$NF就代表最后一个字段。
echo 'this is a test' | awk '{print $NF}'
awk的其他内置变量:
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g
函数
toupper()用于将字符转为大写。
awk -F ':' '{ print toupper($1) }' students_store
echo $PATH | awk 'BEGIN {RS=":"}{print $0}'
echo $PATH | awk 'BEGIN {RS=":"}{print NR,$0}'
3.2常用函数
tolower():字符转为小写。
sin():正弦。
cos():余弦。
sqrt():平方根。
rand():随机数。
函数:
match (s,r) s中是否包含r字符串
awk 'BEGIN {print match("Java小咖秀","va小")}'
split(s,a,fs) 在fs上将s分成序列a
str="java,xiao,ka,xiu"
awk 'BEGIN{split('"\"$str\""',ary,","); for(i in ary) {if(ary[i]>1) print ary[i]}}'
gsub(r,s) 用s代替r,范围全文本
awk 'gsub("Xiaoka","xk") {print $0}' students_store
gsub(r,s,t) 范围t中,s代替r
substr(s,p) 返回字符串s从第p个位置开始后面的部分(下标是从1 开始算的,大家可以自己试试)
awk 'BEGIN {print substr("xiaoka",3)}'
substr(s,p,n) 返回字符串s从第p个位置开始后面n个字符串的部分
awk 'BEGIN {print substr("xiaoka",3,2)}'
length(s) 返回s长度
awk 'BEGIN {print length(" hello,im xiaoka")}
index(s,t) 返回s中字符串t第一次出现的位置
awk 'BEGIN {print index("xiaoka","ok")}'
结合正则
符号 ~ 后接正则表达式
模糊匹配|查询已经分班的学生
awk '$0 ~/class/' students_store
精准匹配|查询1班的学生
awk '$7=="class-1" {print $0}' students_store
反向匹配|查询不是1班的学生
awk '$7!="class-1" {print $0}' students_store
比较操作
查询数学大于80的
awk '$2>60 {print $0}' students_store
匹配指定字符中的任意字符
awk '$0 ~/(class-1|class-3)/' students_store
复合表达式
awk '{ if ($2 > 60 && $3 > 60) print $0}' students_store
printf格式输出
echo "66" | awk '{printf "%c\n",$0}'
常见格式:
%c ASCII
%d 整数
%o 八进制
%x 十六进制数
%f 浮点数
%e 浮点数(科学记数法)
% s 字符串
%g 决定使用浮点转化e/f
内置变量
NF :记录浏览域的个数,在记录被读后设置。
NR :已读的记录数。
FS : 设置输入域分隔符
条件:
awk允许指定输出条件,只输出符合条件的行。
awk '条件 动作' 文件名
awk -F ':' '/usr/ {print $1}' demo.txt print命令前面是一个正则表达式,只输出包含usr的行。
只输出奇数行
awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt
输出第三行以后的行
awk -F ':' 'NR >3 {print $1}' demo.txt
输出第一个字符等于指定值的行
awk -F ':' '$1 == "root" {print $1}' demo.txt
awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt
if 语句
awk提供了if结构,用于编写复杂的条件
输出第一个字段的第一个字符大于m的行
awk -F ':' '{if ($1 > "m") print $1}' demo.txt
if ...else
awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt
3.3 awk脚本
1.先创建一个awk文件
vim printname.awk
2.脚本第一行要指定解释器
#!/usr/bin/awk -f
3.编写脚本内容,打印一下名称
#!/usr/bin/awk -f
#可以加注释了,哈哈
BEGIN { print "my name is Java小咖秀"}
4.既然是脚本,必不可少的可执行权限安排上~
chmod +x printname.awk
5.有了可执行权限,我们来执行下看结果
./printname.awk
4.sed
4.1sed处理流程
1.首先将一行存储到一个模式空间内
2.sed命令处理
3.显示在屏幕上
4.然后清空模式空间
循环处理上述步骤,直到全部处理完
4.2常用命令
i:直接修改原始文档内容
a:新增
d:删除选择行
c:取代
p:打印行
s:查找
y: 替换
q: 退出
w:另存文件
替换符
数字:替换第几行
g: 全局替换
4.3实例
sed -i '/s/#/#' 使用
sed文件
root@ubuntu:/home/lulu/Desktop/Test# cat sed
hell
hello
执行
root@ubuntu:/home/lulu/Desktop/Test# sed -i 's/h/H/' sed
root@ubuntu:/home/lulu/Desktop/Test# cat sed
Hell
Hello
sed -i ‘/s/#/#/g’ 与 sed -i '/s/#/#' 区别 加上g表示全部替换
root@ubuntu:/home/lulu/Desktop/Test# cat sed
hell
hhello
hhhhh
root@ubuntu:/home/lulu/Desktop/Test# sed -i 's/h/H/' sed
root@ubuntu:/home/lulu/Desktop/Test# cat sed
Hell
Hhello
Hhhhh
root@ubuntu:/home/lulu/Desktop/Test# sed -i 's/h/H/g' sed
root@ubuntu:/home/lulu/Desktop/Test# cat sed
Hell
HHello
HHHHH
使用sed -i 去除文档内容
去掉 “行首” 带“@”的首字母@
root@ubuntu:/home/lulu/Desktop/Test# sed -i "s/^@//" sed
root@ubuntu:/home/lulu/Desktop/Test# cat sed
hell
hello
$
#
sed -i 加上 i 使用 在指定内容之间增加一行
root@ubuntu:/home/lulu/Desktop/Test# cat sed
Hell
HHello
HHHHH
root@ubuntu:/home/lulu/Desktop/Test# sed -i '/H/i 0' sed
root@ubuntu:/home/lulu/Desktop/Test# cat sed
0
Hell
0
HHello
0
HHHHH
sed -i 配合 a在指定字符后新增一行新内容
root@ubuntu:/home/lulu/Desktop/Test# sed -i '/H/a 0' sed
root@ubuntu:/home/lulu/Desktop/Test# cat sed
0
Hell
0
0
HHello
0
0
HHHHH
0
root@ubuntu:/home/lulu/Desktop/Test#
sed -i 配合d 删除指定字符
root@ubuntu:/home/lulu/Desktop/Test# sed -i '/H/d' sed
root@ubuntu:/home/lulu/Desktop/Test# cat sed
0
0
0
0
0
0
sed -i 配合c
root@ubuntu:/home/lulu/Desktop# echo "cat dog fish cat" | sed -e 's/cat/wulala/g'
wulala dog fish wulala
root@ubuntu:/home/lulu/Desktop# echo "cat dog fish cat" | sed -e 's/cat/wulala/'
wulala dog fish cat
按行替换(替换2到最后一行)
sed '2,$s/to/can/' sed
删除:
sed '2d' sed
显示行号删除
sed '=;2d' sed
删除第2行到第四行:
sed '=;2,4d' sed
删除2到5行内容
sed "2,5d" sed
添加行:
向前插入
lulu@ubuntu:~/Desktop/Test$ echo "hello" | sed 'i kitty'
kitty
hello
lulu@ubuntu:~/Desktop/Test$ echo "hello" | sed 'i/kitty'
/kitty
hello
每一行前添加 -i 会更改原文件内容
cat sed | sed 'i\kitty'或者(sed 'i\kitty' sed)
在第二行添加
sed '2i drink tea' sed
在第二行后加
sed '2a drink tea' sed
换行追加
sed "2a 2,CEO\n3.haven" sed
打印行:
单独使用p的时候,表示将全部输出
sed '2p' sed
当结合-n使用的时候,只是打印想要打印的内容
cat sed | sed -n '2p' 或者 sed -n '2p' sed
输出10-15行
sed -n '1,+2p' sed
修改行:
替换第二行为hello kitty
sed '2c\hello kitty' sed
替换第二行到最后一行为hello kitty
sed '2,$c\hello kitty' sed
写入行
把带star的行写入c文件中,c提前创建
sed -n '/star/w c' sed
4.4全局替换
sed 's/it/hello/g' sed
直接修改文件内容(加了-i参数可以直接修改文件内容,不加是在模式控件内修改)
sed -i 's/I/hello/g' sed
-i 也可以将已经存在的文件,再修改之前进行备份,
sed -i.bak ‘'s/it/hello/g' sed 通过查看可以看到多了.bak文件
总结:格式:sed 'Ms###Ng' (M行,第N列之后)
存在sg,不存在MN,表示全局变化
存在sg,存在M,不存在N,表示变化第M行
存在sg,存在N,不存在M,表示变化从第N列之后
存在sg,存在MN,表示变化第M行,从第N列开始
存在s,不存在g,不存在MN,表示第一列
存在s和M,不存在g,表示 第M行第一列
不存在s,不管是否存在Ng都不会变化
当在使用全局变量g的时,如果连同i一起使用,表示忽略大小写:
sed 's#Hello#I#gi' sed 忽略hello是否大小写
退出
打印3行后,退出sed
sed '3q' sed
w表示另存文件
将文件sed 另存为se1 并且源文件依然存在
sed 'w sed1' sed
5w表示将文件的第五行存在另一个文件中
sed '5w sed1' sed
5 find使用
命令形式:find [起始目录] 寻找条件 操作
寻找条件
参数说明:
时间:
-atime n :查找n天以前被访问过的所有文件。
-ctime n : 查找n天以前文件状态被修改过的所有文件
-mtime n :查找n天以前文件内容被修改过的所有文件
使用名称:
-gid n :寻找 群组 ID 为 n 的文件
-group name :寻找群组名称为 name的文件
-uid n :寻找拥有者 ID 为 n 的文件
-user name :寻找使用者名称为 name 的文件
-name file :寻找档名为 file 的文件名称(可以使用万用字符)
-type type :寻找档案属性为 type 的档案,type 包含了 b, c, d, p, l, s,这些与前一章的属性相同!例如 l 为 Link而 d 为路径之意!
使用:
查看属于用户lulu的文件
root@ubuntu:/home/lulu/Desktop/Test# find ./ -user lulu
./
./sed
./Sed
./grep.txt
./OpenSed
./sed.txt
./Psed
./students_store
查看当前目录为空的文件或文件夹
root@ubuntu:/home/lulu/Desktop/Test# find ./ -empty
./sed
./Sed
./OpenSed
./Psed
查看以txt结尾的文件
root@ubuntu:/home/lulu/Desktop/Test# find ./ -name '*.txt'
./grep.txt
./sed.txt
查看当前目录文件
lulu@ubuntu:~/Desktop/Test$ find ./ -name sed.txt
./sed.txt
全部文件列表
lulu@ubuntu:~/Desktop/Test$ find ./ -type f
./grep.txt
./sed.txt
./students_store
根据 文件或目录名称 搜索:-name和-iname的区别一个区分大小写,一个不区分大小写
lulu@ubuntu:~/Desktop/Test$ find ./ -iname sed
./sed
./Sed
lulu@ubuntu:~/Desktop/Test$ find ./ -name sed
./sed
模糊搜索 以sed结束的文件或目录
lulu@ubuntu:~/Desktop/Test$ find ./ -name *sed
./sed
lulu@ubuntu:~/Desktop/Test$ find ./ -iname '*sed'
./sed
./Sed
./OpenSed
./Psed
以se结尾的文件或目录名
lulu@ubuntu:~/Desktop/Test$ find ./ -iname 'se?'
./sed
./Sed
查看文件具体信息:
root@ubuntu:/home/lulu/Desktop/Test# ls -lh
总用量 20K
-rw-r--r-- 1 lulu lulu 96 9月 29 19:22 grep.txt
drwxr-xr-x 2 lulu lulu 4.0K 9月 29 20:18 OpenSed
drwxr-xr-x 2 lulu lulu 4.0K 9月 29 20:18 Psed
-rw-r--r-- 1 lulu lulu 0 9月 29 20:16 sed
-rw-r--r-- 1 lulu lulu 0 9月 29 20:16 Sed
-rw-r--r-- 1 lulu lulu 55 9月 29 19:10 sed.txt
-rw-r--r-- 1 lulu lulu 213 9月 29 19:48 students_store
root@ubuntu:/home/lulu/Desktop/Test# find ./ -size +2
./
./OpenSed
./Psed
这里 +n 表示大于,-n 表示小于,n 表示等于 1 数据块 == 512 字节 0.5KB,也就是1KB等于2数据块 100MB == 102400KB204800数据块