Linux 四剑客

目录

Linux三剑客

1.管道

2.grep

2.1命令

2.2实例  

2.3正则匹配

3.awk

3.1基本用法

3.2常用函数

3.3 awk脚本

4.sed

4.1sed处理流程

4.2常用命令

4.3实例

4.4全局替换

5 find使用


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正则表达式:

基本表达式:

  1.  ^开头$结尾
  2. [a-z][0-9]区间
  3. *0个或多个

基本正则(BRE)与扩展正则区别(ERE)

  1. ?非贪婪匹配 重复零次或者一次
  2. +重复一个或者多个
  3. ()分组
  4. {}范围约束   {n}重复n次  {n,}重复n次或更多次  {n,m}重复n到m次
  5. |匹配多个表达式的任何一个 表示或


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数据块



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>