一、bash

  1. bash是什么
    1. bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令
    2. bash还能从文件中读取linux命令,称之为脚本
    3. bash支持通配符、管道、命令替换、条件判断等逻辑控制语句
  2. bash的特性
    1. 打印输出
    2. 命令别名
    3. 命令历史
    4. 快捷键
    5. 命令补全 ```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 #删掉某一个别名

  1. ```python
  2. !! #执行上一次执行的命令 #快捷神器
  3. ctrl + a/e/u/k/l #移动到行首/行尾/删除光标之前的字符/之后的字符/清屏

二、正则表达式

  1. 分类
    1. 基本的正则表达式 BRE 对应元字符有^ $ . [ ] *
    2. 扩展的正则表示 ERE 在BRE的基础上增加了( ) { } ? + |
  2. 意义
    1. 处理字符串、文本
    2. 过滤、替换
  3. 操作

需要结合sed、grep、awk进行操作
通配符是大部分普通命令都支持的,用于查找文件或目录,而正则表示式是通过三剑客命令在文件数据流中过滤信息的。

  1. ^ 用户模式的最左侧,匹配以什么开头的行
  2. $ 用于模式的最右侧,表示以什么结尾的行
  3. ^$ 组合符,表示空行
  4. . 组合出现表示:匹配任意一个且有只有一个字符,单独出现表示:不能匹配空行
  5. \ 转义字符,让特殊含义的字符,现出原形,还原本意,如\.代表小数点
  6. * 匹配一个字符(连续出现)多次,重复0次代表空,匹配所有内容
  7. .* 组合符,匹配任意长度的任意字符
  8. ^.* 组合符,匹配任意多个字符开头的内容
  9. .*$ 组合符,匹配以任意多个字符结尾的内容
  10. [abc] 匹配[]集合内的任意一个字符
  11. [^abc] 匹配除了^后面的任意字符
  1. 扩展的正则表达式必须用grep -E才能生效
  2. + 匹配到当前一个字符1次或者多次,前面一个字符至少出现1
  3. [:/]+ 匹配括号内的.或者/字符一次或者多次
  4. 匹配前一个字符0次或者1次,前面字符可有可无
  5. | 表示或者,同时匹配多个字符串
  6. () 分组过滤,被括起来的内容表示一个整体
  7. a{n,m} 匹配前一个字符最少n次,最多m
  1. [root@ylinux opt]# grep -i -n '^m' luffy.txt #以m开头的行,-i 忽略大小写,-n 显示行号
  2. 5:my qq is 110
  3. 7:my name is ylin
  4. [root@ylinux opt]# grep -i -n 'r$' luffy.txt #以r结尾的行
  5. 1:i am oldboy teacher
  6. [root@ylinux opt]# grep -i -n '\.$' luffy.txt #显示以.结尾的行,特殊符号需要添加转义字符
  7. 15:lin.
  8. [root@ylinux opt]# grep -n '^$' luffy.txt #显示空行,并显示行号
  9. 4:
  10. [root@ylinux opt]# grep -n '^.y' luffy.txt #匹配
  11. 5:my qq is 110
  12. 7:my name is ylin
  13. [root@ylinux opt]# grep -n '.*' luffy.txt #匹配任意

三、grep

  1. 作用 文本搜索工具,根据用户指定的过滤条件对目标文本逐行进行匹配检查,打印匹配到的行
  2. 模式 由正则表达式的 元字符 以及 文本字符 所编写出的过滤条件
    1. 语法:
    2. grep [options] [pattern] file
    3. 命令 参数 匹配模式 文件数据
    4. -iignorecase,忽略字符的大小写;
    5. -o:仅显示匹配到的字符串本身;
    6. -v, --invert-match:显示不能被模式匹配到的行;
    7. -E:支持使用扩展的正则表达式元字符;
    8. -q, --quiet, --silent:静默模式,即不输出任何信息;
    9. -n 显示行号
    10. -c 只统计匹配到的行
    11. -w 只匹配过滤的单词
    12. -o 只输出匹配的内容
    ```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

[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

  1. ```python
  2. [root@ylinux opt]# grep -n -i -E 'l+' luffy.txt #扩展的正则表达式,-E必须要加;+匹配前一个字符一次或者多次
  3. [root@ylinux opt]# grep -E -n 'go?d' luffy.txt #匹配前面一个字符出现一次或者零次
  4. 21:god
  5. [root@ylinux opt]# grep -E -n 'l|M' luffy.txt #匹配l或者m出现的行
  6. [root@ylinux opt]# grep -E -n 'g(oo|la)d' luffy.txt #分组过滤
  7. 20:good
  8. 22:good
  9. 24:glad
  10. [root@ylinux opt]# grep -n -E '(root).*\1' /etc/passwd #匹配root开始和root结尾的中间不管包含什么
  11. 1:root:x:0:0:root:/root:/bin/bash
  1. [root@ylinux opt]# grep -E '^(root|www)\>' /etc/passwd #匹配root或者www的用户组信息
  2. root:x:0:0:root:/root:/bin/bash
  3. www:x:1507:1507::/home/www:/bin/bash
  4. [root@ylinux opt]# grep -E '\<[0-9]{2}\>' /etc/passwd #匹配用户组ID中为两位或者是三位的信息,\>右边闭合 \<左边闭合
  5. [root@ylinux opt]# grep '^[[:space:]].*' love.txt #只匹配首行有一个空的行
  6. I ike
  7. i xx
  8. [root@ylinux opt]# grep -E '^([^:]+\>).*\1$' /etc/passwd #匹配一个用户已什么开头什么结尾的,,[^:]代表的一串字母
  9. sync:x:5:0:sync:/sbin:/bin/sync
  10. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  11. halt:x:7:0:halt:/sbin:/sbin/halt
  12. bash: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"