bash

  • bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令
  • bash还能从文件中读取linux命令,称为脚本
  • bash还支持通配符,管道,命令替换,条件判断等逻辑控制语句

bash的特性

  • 命令行展开
1
2
3
4
5
6
7
8
echo {tom,bob,chaoge,jerry}

echo {1..20}

echo {01..20}

echo {1..20..2}

  • 命令别名
1
2
3
4
5
6
7
8
// 查看当前的别名
alias

// 删除别名
unalias rm

// 添加一个别名
alias rm='rm -i'
  • 历史记录
1
2
3
history
!行号
!! 上一次执行的命令
  • 快捷键

ctrl + a 移动到行首
ctrl + e 移动到行尾
ctrl + u 删除光标之前的字符
ctrl + k 删除光标之后的字符
ctrl + l 清屏,相当于clear

Linux三剑客

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

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

Linux 正则表达式

  • 正则表达式是一套规则和方法
  • 正则工作时以行为单位,一次处理一行
  • 正则表达式化繁为简,提高工作效率
  • linux仅受三剑客(sed,awk,grep)支持,其它命令无法使用

基本正则表达式BRE集合

  • 匹配字符
  • 匹配次数
  • 位置错定
符号 作用
^ 尖角号,用于模式的最左侧,如^oldboy 匹配以oldboy单词开头的行
$ 美元符,用于模式的最右侧,如oldboy$ 表示以oldboy单词结尾的行
^$ 组合符,表示空行
. 匹配任意一个且只有一个字符,不能匹配空行
\ 转义字符,让特殊含义的字符,现出原形,还原本意,例如\. 代表小数点
* 匹配前一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容
.* 组合符,匹配所有内容
^.* 组合符,匹配任意多个字符开头的内容
.*$ 组合符,匹配以任意多个字符结尾的内容
[abc] 匹配集合内的任意一个字符,a或b或c,可以写[a-c]
[^abc] 匹配除了^后面的任意字符,a或b或c,表示对[abc]的取反

扩展正则ERE集合

扩展正则表达式必须用grep -E且才能生效

字符 作用
+ 匹配前一个字符1次或多次
[: /]+ 匹配括号内的”:”或者”/字符1次或多次
? 匹配前一个字符0次或1次
| 表示或者,同时过滤多个字符串
() 分组过滤,被括起来的内容表示一个整体
a{n,m} 匹配前一个字符最少n次,最多m次
a{n.} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配前一个字符最多m次

grep

全拼:Global search REgullir expression and Print out the line.

作用:文本搜索工具,根据用户指定的模式(过滤条件)对目标文本逐行进行匹配检查,打印匹配到的行

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

1
2
3
4
5
6
7
8
9
10
11
语法
grep [options] [pattern] file
命令 参数 模式 文件数据
-i 忽略字符大小写
-o 仅显示匹配到的字符串本身
-v 显示不能被模式匹配到的行
-E 支持使用扩展正则表达式元字符
-q 静默模式,不输出任何信息
-c 统计匹配的行数
-w 完整匹配,只匹配过滤的单词,即精确匹配整个单词
-n 显示行号

正则表达式练习

准备练习文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
touch test.txt
echo I am oldboy teacher. >>test.txt
echo I teach linux. >>test.txt
echo I like python. >>test.txt
echo >> test.txt
echo My qq is 68493238290. >>test.txt
echo >> test.txt
echo My name is yjr1100. >>test.txt
echo >> test.txt
echo Our shcool website is http://sdfsdfdsdfd.com >>test.txt
echo >> test.txt
echo >> test.txt


touch test2.txt
echo good >> test2.txt
echo god >> test2.txt
echo gd >> test2.txt
echo goooooood >> test2.txt
echo gooood >> test2.txt
echo he love his love >> test2.txt
echo he like his love >> test2.txt
echo my love mine love >> test2.txt
echo my dont like apple >> test2.txt


  1. 输出所有以m开头的行

    1
    2
    grep ^m test.txt -n
    grep ^m test.txt -in
  2. 输出所有以i开头的行

    1
    grep ^i test.txt -in
  3. 输出所有以.结尾的行

    1
    grep "\.$" test.txt -n

注意,在linux下,文件所有行结尾都有一个$符号

  1. 匹配所有不是空行的

    1
    grep "." test.txt -n
  2. 匹配所有内容

    1
    grep ".*" test.txt -n
  3. 找出包含htt和hco的行

    1
    grep -E "h(tt|co)." test.txt -n
  4. 匹配test2中 good,gooood 等

    1
    grep -E "go{2,}d" test2.txt
  5. 匹配前后都有 love 的行

    1
    grep -E "(love).*\1" test2.txt 

sed

注意sed和awk使用单引号,双引号有特殊解释

sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。

sed是操作、过滤和转换文本内容的强大工具。
常用功能包括结合正则表达式对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤(过滤指定字符串)、取行(取出指定行)。

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sed [选项] [sed内置命令字符] [输入文件]

选项:
-n 取消sed默认的输出,常与内置命令p一起用
-i 直接将修改结果写入文件,不用i sed修改的是内存数据
-e 多次编辑,不需要管道符了
-r 支持正则扩展

内置命令字符
a Append,对文本进行追加,在指定行后面添加一行/多行文本
d Delete,删除匹配行
i insert,表示插入文本,在指定的行前多添加一行/多行文本
p Print 打印匹配行的内容,通常P与-n 一起用
s/正则/替换内容/g 匹配正则内容,然后替换,结尾g代表全局匹配

sed匹配范围

范围 解释
空地址 全文匹配
单地址 指定文件某一行
/pattern/ 被匹配到的每一行
范围区间 10,20 十到二十行,10,+5第10行向下5行,/pattern1/,/pattern2/
步长 1~2表示1,3,5,7,9奇数行,2~2 表示2,4,6,8,10 偶数行

sed练习

  1. 输出第二行和第三行

    1
    sed -n '2,3 p' test.txt
  2. 输出第二行后的三行

    1
    sed -n '2,+3 p' test.txt
  3. 输出有python的行

    1
    sed -n '/python/p' test.txt
  4. 删除包含qq的行

    1
    sed '/qq/d' test.txt -i
  5. 将所有的my改位he

    1
    sed 's/My/hei/g' test.txt -i
  6. 将所有的is替换为are,并且把python 改为java

    1
    sed -e 's/is/are/g' -e 's/python/java/g' test.txt -i
  7. 在第二行后插入一行

    1
    sed '2a My linux is not good' test.txt -i
  8. 在第四行前插入一行

    1
    sed '4i My linux is not good' test.txt -i

awk

awk是一个强大的iux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式

awk早期在Unix上实现,我们用的awk是gawk,是GUN awk的意思

awk更是是一门编程语言,支持条件判断、数组、循环等功能

awk语法

1
awk [opthon] 'pattern[action]' file ...

action指的是动作,awk擅长文本格式化,而且输出格式化后的结果,因此最常用的动作就是print和printf

awk 外层单引号,内层双引号

参数 解释
-F 指定分割字段
-v 定义或修改一个awk内部的变量
-f 从脚本文件中读取awk命令

变量

  • 内置变量
    内置变量 解释
    FS 输入字段分隔符,默认为空白字符
    OFS 输出字段分隔符,默认为空白字符
    RS 输入记录分隔符(输入换行符),指定输入时的换行符
    ORS 输出记录分隔符(输出换行符),输出时用指定符号代替换行符
    NF NF:number of Field,当前行的字段的个数(即当前行被分割成了几列,字段数量
    NR NR:行号,当前处理的文本行的行号。
    FNR FNR:各文件分别计数的行号
    FILENAME FILENAME:当前文件名
    ARGC ARGC:命令行参数的个数
    ARGV ARGV:数组,保存的是命令行所给定的各参数
  • 自定义变量
    1
    awk -v myvar="yjr1100" 'BEGIN{print myvar}{print $1,myvar}' test.txt

格式化输出printf

要点:

  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”

awk的模式

  1. BEGIN/END 模式
    BEGIN{} 处理完指定的文本前,先执行BEGIN模式指定的动作
    END{} 处理完所有文本只有,执行END{}模式指定的动作

    1
    awk 'BEGIN{print "处理文本之前"}{print $0}END{print "处理文本后"}' test.txt
  2. 运算符模式

    关系运算符 解释 示例
    < 小于 x<y
    <= 小于等于 x<=y
    == 等于 x==y
    != 不等于 x!=y
    >= 大于等于 x>=y
    > 大于 x>y
    ~ 匹配正则 x~/正则/
    !~ 不匹配正则 x~/正则/
    1
    awk 'NR!=3{print $0}' test.txt
  3. 正则模式

    语法:

    1
    2
    grep '正则表达式' test.txt
    awk '/正则表达式/动作' test.txt
    1
    awk -F ':' '/games/{print $1,$NF}' pwd.txt

    想要使用多个正则表达式,只需要在正则表达式之间用逗号隔开就可以

awk 练习

1
2
3
4
5
6
7
8
9
10
11
touch test.txt

echo pyyu{6..9} >> test.txt
echo pyyu{11..15} >> test.txt
echo pyyu{16..20} >> test.txt
echo pyyu{21..25} >> test.txt
echo pyyu{26..30} >> test.txt
echo pyyu{31..35} >> test.txt
echo pyyu{36..40} >> test.txt
echo pyyu{41..45} >> test.txt
echo pyyu{46..50} >> test.txt

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

awk是按行处理文件,一行处理完毕,处理下一行,根据用户指定的分隔符去工作,没有指定则默认空格

  1. 输出每一行 $0代表一整行

    1
    awk '{print $0}' test.txt
  2. 输出第二列 $2代表第二列

    1
    awk '{print $2}' test.txt
  3. 输出最后一列,倒数第二列,NF代表分隔后,当前行一共有多少字段

    1
    awk '{print $NF,$(NF-1)}' test.txt
  4. 输出第五行,NR代表当前文件的行数

    1
    awk 'NR==5{print $0}' test.txt
  5. 输出代行号的文件

    1
    awk '{print NR,$0}' test.txt
  6. 输出用y分割后的第三列结果

    1
    awk -F 'y' '{print $3}' test.txt
  7. 输出用===分割,用y分割后的第三列和第五列结果,OFS代表分隔符变量,-v修改内置变量

    1
    awk -F 'y' -v OFS="===" '{print $3,$5}' test.txt
  8. 格式化输出

    1
    awk '{printf "%s\n",$0}' test.txt