三剑客通配符
2022-10-07 08:10:59 0 举报
AI智能生成
Linux-三剑客 grep awk sed 基础用法
作者其他创作
大纲/内容
什么是通配符
当你在查找特定文件名,却不记得如何拼写时,通配符是帮你寻找的神器。
通配符是专门用于处理文件名的特殊字符,而不是文件内容!
可以方便查找类似、但是不相同的文件名。
通配符是shell的内置语法、大部分linux命令都认识通配符
大多数时候结合find 对文件进行查找
最后再说一次!通配符是找文件名 !!! 文件内容是正则的
常用通配符
* 匹配任意字符
匹配任意(0或多个)字符串,包括空字符串
找出以y开头的txt文件
ls y*.txt
找出机器上,所有的以数字开头的sh文件
find / -name '[0-9]*.sh'
? 匹配任意一个字符
匹配任意1个字符,且只有一个字符
很少用
作用不大,只用于特定场景
一个问号就表示一个字符,几个个问号就几个字符
ls ?.txt;ls ??.txt; ls ???.txt
[] 匹配方括号里的内容
[abcd] 匹配方括号里的abcd任意一个字符,abcd可以是其他不连续的字符如[aqwd]
注意点
[a-z] 找到a到z之间的所有字母,不区分大小写了
只能限定的使用[abc]或[ABC],不能使用范围,否则都会找出来
#找出以y开头相关的log ,用中括号去找
ls y[0-9a-z].log
以及注意,一个括号表示的是匹配一个字符,而不是多个字符
[!字符] 或[^字符]
不匹配方括号里的任意字符
也可以写为连续的字符,如[!a-z],也就是不匹配a到z任意的一个字符,且!符可以用^替代,写成[^abcd]
排除所有名字里包含y和u字符开头的文件,注意加上星号
ls [!yu]*
ls [^yu]*
找出任意除了y和u的单个字符的sh文件
ls [!yu].sh
find找文件与通配符
搜索/etc下所有包含hosts相关字符的文件
find /etc -name '*hosts*'
搜索/etc下的以ifcfg开头的文件(网卡配置文件)
find /etc -name 'ifcfg*'
只查找以数字结尾的网卡配置文件
find /etc -name 'ifcfg*[0-9]'
找到系统中的第一块到第四块磁盘,注意磁盘的语法命名
find /dev -name 'sd?'
找找sdb硬盘有几个分区
find /dev -name 'sd?[0-9]'
grep
正则表达式
正则表达式就是为了`处理大量的字符串`而定义的一套规则和方法。
通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。
Linux 正则表达式一般以行为单位处理的。
正则主要包含了三个命令,sed、awk、grep三剑客命令
正则的使用
正则表达式是一套规则和方法
正则工作时以单位进行,一次处理一行
正则表达式化繁为简,提高工作效率
linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用
注意事项
正则表达式应用非常广泛,很多编程语言都支持正则表达式,用于处理字符串提取数据。
通配符是大部分普通命令都支持的,用于查找文件或目录
而正则表达式是通过三剑客命令在文件(数据流)中过滤内容的,注意区别
linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用
以及注意字符集,需要设置`LC_ALL=C`,注意这一点很重要)(常常脚本中使用)
字符集设置
LC_ALL=C 这个变量赋值的动作,是还原Linux的字符集
还原字符集的作用
因为我们系统本身是支持多语言系统的,生成了不同的编码表
不同的编码表,不同的符号可能不同,不兼容,所占字符也不同
如果你的系统编码是中文,很可能导致你的正则出错
使用
export LC_ALL=C
防止导致正则或程序出错
可以查看系统的支持语言
locale
正则表达式分类
基础正则表达式
包含了一些特殊字符
默认的都是基础正则模式
扩展正则表达式
包含了一些其他的元字符
使用扩展需要加参数,否则不能识别
转义符
反斜杠 \
反斜杠用于在元字符前添加,使其成为普通字符
反斜杠用于在元字符前添加,使其成为普通字符
关于单引号、双引号
没使用变量的话,请你都用单引号
所见即所得,可以用于匹配如标点符号,还原其本义。
如果涉及变量,建议使用双引号
能够识别linux的特殊符号、或变量,需要借助转义符还原字符本义。
当需要引号嵌套时,一般做法是,双引号,嵌套单引号。
基础正则
语法:grep '关键字,模式,正则表达式' 数据流
grep,过滤关键字信息数据。主要是用于查文本内的数据
grep命令常用的语法
-i :不区分字符的大小写
-o :仅显示匹配到的字符串本身,只输出匹配内容
-v :显示不能被模式匹配到的行,排除匹配结果
用于排除空行
过滤查找的信息中grep自己的信息
-E :支持使用扩展的正则表达式元字符
-n :显示行号
-c :统计行数
开头结尾
^ 尖角符
写于最左侧,表示匹配以什么开头的行
找出m或M开头的行(忽略大小写)
grep '^m' t1.log -n -i
找出以my开头的行,其只显示字符
只显示grep每次匹配到的结果,而不是匹配到的文本行数据
只显示grep每次匹配到的结果,而不是匹配到的文本行数据
grep '^my' t1.log -i -n -o
$ 美元符
word$ 匹配以word结尾的行
匹配所有以字符n结尾的行
grep 'n$' t1.log
匹配所有以.结尾的行
grep '\.$' t1.log
点注意使用转义为普通字符
^$ 匹配空行
及开头与结尾都没有内容
grep '^$' t1.log -n -v
排除文件中的空行
常常用在查看配置文件中
匹配,转义
. 点符
. 匹配除换行符的所有字符
找出符合.ac正则的行,任意的字符后有ac的行,一共是三个连续的字符
grep '.ac' t1.log
匹配除了换行符以外所有的内容、字符+空格,除了换行符。
\ 转义符
让有特殊意义的字符,现出原形,还原其本义
元字符
\b 匹配单词边界
\n 匹配换行符
\t 匹配一个横向的制表符
*星号
重复前一个字符0此或n次
grep 'w*' t1.log
#这样会找到所有的信息
#这样会找到所有的信息
加上 -o 才会过滤到找出的信息
.* 符
找出任意内容,[这一行有东西,没东西,]全给找出来,是*的作用
^.*符号
以任意内容开头
.*$ 符
以任意多个字符结尾的行
[ ] 中括号
匹配括号内的内容
[abc] 匹配括号内的小写a、b、c字符
[A-Z] 匹配大写字母
[a-z0-9] 匹配小写字母和数字
[a-z0-9A-Z] 匹配大写、小写字母、数字,没有空格,特殊符号
[^a-zA-Z0-9]只想拿到特殊符号,对中括号里的字符进行取反即可
也不能使用!(叹号),这个是通配符使用的,不是正则
注意不能使用-v ,-v是取没有找到的行,不是对应的字符
扩展正则
注意
扩展正则在使用时需要注意,一般都需要添加参数,否则默认只支持正则,扩展的符号可能不识别
使用-E参数是最新扩展正则用法
grep -E xxx
Main Topic
Main Topic
{ } 花括号
a{n}
正好匹配a字符n次
grep -E '8{3}' t3.log
a{n,m}
匹配a字符n<=x<=m次
grep -E '8{1,3}' t3.log
a{n,}
匹配最少多少次
a{,m}
匹配最多多少次
grep -E '8{,3}' t1.log
+加号
#重复前一个字符1次或多次
#匹配一次或者多次,没有的行是不会显示的
#匹配一次或者多次,没有的行是不会显示的
注意和*的区别,*是0次或多次,找不到的那一行,也会显示出来
[0-9]+
从文中找出连续的数字,等于排除字母,特殊符号、空格
grep -E '[0-9]+' t3.log
当找出的数字有限定时,比如手机号码11位数字
grep -E '[0-9]{11}' t3.log
[A-Za-z0-9]+
去除标点符号
grep -E '[A-Za-z0-9]+' t1.log -o
| 或者符
竖线在正则里是或者的意思
竖线在正则里是或者的意思
grep '^$' t1.log -v | grep '^#' -v
注意第二给grep不要加文件名,它处理的数据是第一个
grep -E '^$|^#' t1.log -n -v
直接排除空行或注释行
( ) 括号
() 作用是将一个或者多个字符捆绑在一起,当做一个整体进行处理
简单理解为分组
1.可以用括号,把正则括起来,以及系统最多支持9个括号
小括号功能之一是分组过滤被括起来的内容,括号内的内容表示一个整体
2.括号内的数据,可以向后引用,
() () () () \1 \2 \3 \4
() () () () \1 \2 \3 \4
括号()内的内容可以被后面的"\n"正则引用,n为数字,表示引用第几个括号的内容
\1:表示从左侧起,第一个括号中的模式所匹配到的字符
\2:从左侧起,第二个括号中的模式所匹配到的字符
\1:表示从左侧起,第一个括号中的模式所匹配到的字符
\2:从左侧起,第二个括号中的模式所匹配到的字符
使用
要求仅仅匹配出glad和good
(将数据当成一个整体来处理)
(将数据当成一个整体来处理)
grep -E 'g(oo|la)d' t3.log
提取love出现2次的行
grep -E '^.*(love).*\1.*' lovers.log
提取/etc/passwd中
用户名和登录解释器名字一样的行
用户名和登录解释器名字一样的行
cat /etc/passwd | grep -E '^(.*):.*\1$'
sed
sed 简介
sed ,对文本数据进行编辑,修改原文件内容
sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。
他会有一个字符工场(sed模式空间),不是直接对原数据处理
匹配失败也会将默认的结果输出到终端,不取消默认输出会看见多行
常用功能
过滤指定字符信息
取出指定的字符行
修改文件内容
sed 语法格式
sed [选项] [sed内置命令字符] [输入文件]
sed 软件参数
options[选项]
解释说明
-n 取消默认的 sed 软件的输出,常与 sed 命令的 p 连用
-e 一行命令语句可以执行多条 sed 命令
-f 选项后面可以接 sed 脚本的文件名
-r 使用正则拓展表达式,默认情况 sed 只识别基本正则表达式
-i 直接修改文件内容,而不是输出终端
解释说明
-n 取消默认的 sed 软件的输出,常与 sed 命令的 p 连用
-e 一行命令语句可以执行多条 sed 命令
-f 选项后面可以接 sed 脚本的文件名
-r 使用正则拓展表达式,默认情况 sed 只识别基本正则表达式
-i 直接修改文件内容,而不是输出终端
sed 命令
a 追加,在指定行后添加一行或多行文本
i 插入,在指定的行前添加一行或多行文本
c 取代指定的行
d 删除指定的行
p 打印模式空间的内容,通常 p 会与选项-n 一起使用
s 取代
i 插入,在指定的行前添加一行或多行文本
c 取代指定的行
d 删除指定的行
p 打印模式空间的内容,通常 p 会与选项-n 一起使用
s 取代
注意:sed默认是不会修改源文件的,只有加上-i才会修改,
但是最好加上-c 进行替换才不会破坏源文件的连接
但是最好加上-c 进行替换才不会破坏源文件的连接
使用扩展正则时记得加上参数 -r
sed匹配范围
sed默认是一行一行,处理文件中每一行的数据
可以指向范围
空地址
全文处理
单地址
指定文件某一行
/pattern/
被模式匹配到的每一行#写入正则,字符数据#
范围区间
10,20 十到二十行`,`10,+5第10行向下5行`,`/pattern1/,/pattern2/`
步长
1~2,表示1、3、5 奇数行
2~2两个步长,表示2、4、6 偶数行
对3到末尾行操作,包括3行
3,${
对匹配字符yuchao到chaoge的行操作
/yuchao/,/chaoge/
增
表示在指定行与行之间,添加新字符数据
单行增加
a 追加,在指定行后添加一行或多行文本
在文件第二行后,插入数据
sed '2a "今天又是美好的一天" ' t1.log
i 插入,在指定的行前添加一行或多行文本
在第二行前,插入数据
sed '2 i 今天雾霾比较大' t1.log
多行增加
以前可以通过,cat实现多行文本追加
cat >>my.log<<EOF
你好
我好
他也好
EOF
你好
我好
他也好
EOF
echo 追加多行数据
可以使用 >> 多次增加,也可以写换行符
单引号会原样输出
echo -e "hello\nworld\n你好\n我也好" > hello.log
需要使用双引号加上参数 -e 识别特殊符号
sed追加多行文本
sed是按行处理文本,可以指定要处理的行,也就是在指定行插入字符数据
使用\n添加多行数据
及换行符
给t1.log 开头,添加两行数据
sed '1 i 加油\n奥里给' t1.log
删
通过d命令,剪切(删除)数据。
删除与范围问题
如果不指定范围,sed默认是删除所有文本行数据了
sed ' d ' t1.log
删除第二行
sed -i '2 d ' t1.log
-i 直接将修改的数据写入到文本
sed删除n到m行
sed 'n,m d' t1.log
删除第三行开始,向下2行,及3-5行
sed '3,+2 d' t1.log
删除奇数行 1,3,5,7,9
sed '1~2 d ' t1.log
删除偶数行 2,4,6,8
sed '2~2 d' t1.log
保留前二行(及删除后面的行)
sed '3,$ d' t1.log
找到game那一行,且删掉
sed '/game/ d' t1.log
删除game这一行到结尾
sed '/game/,$ d' t1.log
删除game和http的行
也就是删除了2个指定的行
也就是删除了2个指定的行
sed '/game/d;/http/d' t1.log
删除正则匹配相关
最好不要使用模糊匹配,要精准的
指向某一行,不然容易出错
指向某一行,不然容易出错
删除My开头的行
sed '/^My/d' t1.log
sed忽略大小写的指令(重要)
sed提供了 大写的I 指令 --- 用于忽略大小写
sed提供了 大写的I 指令 --- 用于忽略大小写
sed '/^My/Id' t1.log
删除以.结尾的行
sed '/\.$/d' t1.log
#需要注意转义
#需要注意转义
删除2和5两行
sed '2d;5d' t1.log
#使用分号,表示一条一条执行删除
#使用分号,表示一条一条执行删除
感叹号取反
感叹号在很多命令里都是取反的作用,
sed也一样,但是是和`sed命令`结合用
sed也一样,但是是和`sed命令`结合用
除了有字符yuchao的行,其他都删除
sed '/yuchao/!d' t1.log
改
因为我们需要用sed来修改各种配置文件,sed这种非交互
式修改文件内容,在脚本中实现自动化修改是最常见的。
式修改文件内容,在脚本中实现自动化修改是最常见的。
如修改nginx的端口
修改mysql的数据存储路径
sshd_config配置文件
替换整行命令(c命令)
c 把选定的行改为新的文本。
#语法
sed '行号 c 修改后的内容' file
sed '行号 c 修改后的内容' file
sed '2c I love linux , python !' t1.log
## 注意后面的字符会原样写入到文本中,有双引号也会原样输出
## 注意后面的字符会原样写入到文本中,有双引号也会原样输出
也可以使用正则进行替换
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
替换字符(s命令)
这个功能占用了sed使用率的80%,
基本替换的功能都是这个s指令
基本替换的功能都是这个s指令
语法:
sed 's/替换前字符/替换后字符/g' file
sed 's/替换前字符/替换后字符/g' file
s 将每一行第一处匹配的字符替换
g 全局替换global,每一行,每一处匹配的字符都替换
字符yuchao改为老于
替换一次
sed 's#yuchao#老于#p' t2.log -n
替换多次,全局替换
sed 's#yuchao#老于#gp' t1.log -n
指定行进行替换
sed '3 s#computer#linux#gp' t2.log -n
添加忽略大小写的命令
sed 's#my#His#Ig' t1.log
sed使用shell变量
需要先添加shelll变量
添加shell变量
new_name="彭于晏"
new_name="彭于晏"
使用变量
sed "s#yuchao#$new_name#g" t1.log
使用正则,分组替换(好用)
sed软件也提供了()分组功能,可以取出对应的数据
() \1向后引用分组数据
取ip
分组提取法,去头去尾,-e 表示多次执行
ifconfig ens33 | sed -e '2 s#^.*inet##' -e '2s#netmask.*##p' -n
直接使用分组,将括号内的内容提取出来
ifconfig ens33 | sed -r '2 s#^.*inet\s+(.*)\s+n.*#\1#p' -n
.*匹配规则是匹配到最后一个,不是在第一个条件达成就停止,是最后一个满足条件才停止提取
使用时一定需要加入限制条件,才能得到需要的数据
使用时一定需要加入限制条件,才能得到需要的数据
查
sed打印命令p 打印sed正则处理后的数据
固定用法,只要使用到了p打印些数据,就是想输出指定数据
必然用-n取消默认打印,目的是,只看到你想p打印的那些数据
必然用-n取消默认打印,目的是,只看到你想p打印的那些数据
打印第二行
sed '2 p ' t1.log
只显示qq号那一行
sed -r '/[0-9]{9}/p' t1.log -n
sed其他命令
w命令
作用是将sed操作结果,写入到指定文件中
格式:sed '/模式(正则)/w new_file' old_file
找出computer这一行,数据写入到game2.log文件中
sed '/computer/w game2.log' t1.log -n
注意,再次使用的是覆盖,并不是进行追加
可以自己创建文件,不需要文件存在
-e选项
-e选项用于接上sed多个命令
语法
sed -e 'sed命令' -e 'sed命令' -e 'sed命令'
sed -e 'sed命令' -e 'sed命令' -e 'sed命令'
sed提取ip地址
ifconfig ens33 | sed -e '2s/^.*inet//' -e '2s/netmask.*//p' -n
; 分号
分号也用于执行多条命令,和linux基础命令一样支持这种写法。
单独提取出1,2,4行信息
sed '1p;2p;4p' t1.log -n
awk
awk原理
awk是一个强大的linux命令,有强大的文本格式化的能力,
好比将一些文本数据格式化成专业的excel表的样式。
好比将一些文本数据格式化成专业的excel表的样式。
它可以理解为不是单单的一门软件了,awk更是是一门编程语言,
支持条件判断、数组、循环等功能
支持条件判断、数组、循环等功能
awk,更适合格式化文本内容,对文本进行复杂处理后、更友好的显示
awk实现的作用
对文本行数据提取数据字段
模式、动作
正则模式匹配
匹配到数据后的动作
awk内置变量(默认预留变量)
awk的语法
awk 指令是由`模式,动作,或者模式和动作的组合`组成.
awk 语法格式: awk [options] 'pattern {action}' file
awk 命令 awk参数 模式 动作 数据流输入文件数据
awk 命令 awk参数 模式 动作 数据流输入文件数据
模式:就是去寻找,使用的方法,如通配符,正则等
找出那些行进行处理
动作:就是找到数据后,需要修改的动作
即是进行打印还是什么问题
awk模式和动作
只有动作
不写模式、默认处理每一行
awk '{print $0}' csawk.log
只有模式
awk不指定动作的话,默认打印整行信息
awk 'NR>=2&&NR<=6' yuchao.log
多个模式和动作
即指定模式,也指定动作
awk 'NR==4{print $0,NF,NR}' yuchao.log
注意点:
awk的动作,必须写在花括号里
{print}
pattern和action都要用单引号,防止shell作特殊解释
是交给awk指向,不是bash!!!!
注意给awk传入数据,一般都是file
不写会卡住不动
也可以是管道传递的数据
cat csawk.log | awk 'NR==2{print $(NF-1)}'
测试数据的生成
echo cc{01..50} | xargs -n 5
参数用法解释
{n..m}
生成连续的数列
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具
-n 选项限制单个命令行的参数个数
行和列的理解
行变量NR、匹配范围语法
number of record
number of record
NR 行
直接打印这个内置变量,表示取当前行的号码,注意写的位置
awk '{print NR,$0}' csawk.log
将行号打印在每行的开头
将行号打印在每行的开头
NR== 等于行
awk 'NR==2{print $1,$4}' csawk.log
输出第二行
NR>= 大于等于行
NR<= 小于等于
NR>=N && NR<=M 从N行到M行
|| 或的用法
NR<= 小于等于
NR>=N && NR<=M 从N行到M行
|| 或的用法
awk 'NR==2{print $1,$4}' csawk.log
列变量NF、每一列的字段
number of field
number of field
直接写NF变量表示每一行字段的总数
awk '{print $0,NF}' csawk.log
显示出每一行有多少字段
显示出每一行有多少字段
$0 输出所有字段
awk 'NR==2{print $0}'csawk.log
提取出第二行的数据
提取出第二行的数据
$N 输出第N列字段
$NF 输出最后一列
$(NF-1) 输出倒数第2列
$NF 输出最后一列
$(NF-1) 输出倒数第2列
其他内置变量
列
FS:字段分隔符,默认是空格和制表符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
行
RS:行分隔符,用于分割每一行,默认是换行符。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
修改变量的参数
-F
-F 紧跟分隔符,表示读入的字段以输入的分隔符分割
awk -F ' '
-v
-v 进入变量模式 可以进行变量的赋值及调用(调用不需要加$符)
awk -v FS=' '
RS变量/ORS变量
RS变量作用是
awk在数据输入时,读取的一个行分隔符
ORS变量的作用是
打印数据后,的一个行分隔符
awk 对每个要处理的输入数据认为都是具有格式和结构的,而不仅仅是一堆字符串
修改RS变量
awk看到空格就认为是新的一行数据
awk -v RS=' ' '{print $0}' test_awk.log
awk -v RS=' ' '{print $0}' test_awk.log
修改ORS变量
把awk输出的行分隔符,改为 @@
awk -v ORS='@@' 'NR<=3{print $0}' csawk.log
面试题解析
测试数据
I have a dog, it is lovely, it is called Mimi. Every time I go home from school, Mimi always cruising around me, I will go to the kitchen to get a piece of meat to it, it lay on the floor to eat. My legs and then jump to bark "Wang "called, so I picked up Mimi, it is the opportunity to lick my hand, making me laugh.I like Mimi, like puppies.
解题思路
1.将一整行的数据,改为,每一个单词,就是一行
简单处理,找到空格就改为换行,修改RS,数据输入换行符,改为RS=' '
复杂处理,找到非连续的大小写字母,就换行
有的单词结尾里带符号
2.改为这样后,就可以交给sort去排序了
-n, --numeric-sort 根据字符串数值比较
-r, --reverse 逆序输出排序结果
-r, --reverse 逆序输出排序结果
3.再去uniq 去重 -c 统计重复的次数
uniq -c 去重+统计
awk答题
简单处理
分行
awk -v RS=' ' '{print $0}' 1.txt
排序
awk -v RS=' ' '{print $0}' 1.txt | sort
统计
awk -v RS=' ' '{print $0}' 1.txt | sort | uniq -c | sort -r | head -5
复杂处理
使用正则将不是字母和数字的当为分隔符
awk -v RS='[^a-zA-z0-9]+' '{print $0}' 1.txt | sort -n| uniq -c | sort -r -n | head -5
tr命令
tr命令就是将字符替换的作用
#用法
#echo 'hello world' | tr 'll' 'LL'
heLLo worLd
#echo 'hello world' | tr 'll' 'LL'
heLLo worLd
tr 命令的一些参数
-c 保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换
-s 将重复出现的字符串压缩为一个字符串
解题思路
将空格和其余标点符号变为 \n 并且压缩为一个字符串(防止出现空行)
解题
cat 1.txt | tr -cs 'a-zA-Z0-9' '\n' | sort -n | uniq -c | sort -nr | head -5
sed命令
#核心还是将文本中的空格和其余符号变为换行符
sed -r 's#[^a-zA-Z0-9]+#\n#g' 1.txt | sort -n | uniq -c | sort -nr | head -5
grep命令
直接取出连续字母字符即可
grep -E '[a-zA-Z]+' 1.txt -o | sort -n | uniq -c | sort -nr | head -5
FS变量/OFS变量
指定分隔符FS
输入字段(列)分隔符,分隔符就是菜刀,把一行字符串切为很多区域
默认的分隔符为空格,但是有时不太适用
如/etc/passwd 中需要提取信息
里面使用的是:进行分隔
里面使用的是:进行分隔
输出字段分隔符OFS
决定awk输出每个字段的分隔符是什么,默认是空格
就是每个逗号的作用
美化输出
column,格式化列显示
-t 判断输入行的列数来创建一个表。分隔符是使用在-s中指定的字符。如果没有指定分隔符,默认是空格
awk进阶
awk提取出允许登录的用户名
awk -v FS=':' '/bash$/{print $1}' /etc/passwd
结尾是bash的行
awk -v FS=':' '/\/bin/bash$/{print $1}' /etc/passwd
指定最后一个字段的正则匹配
BEGIN模式
BEGIN模式作用是在awk开始读取文件行数据、之前就先执行,一般用于预定义一些操作
语法
awk 'BEGIN{} 模式 {动作}'
#注意括号里的语法,模式加在两者之间
awk 'BEGIN{} 模式 {动作}'
#注意括号里的语法,模式加在两者之间
BEGIN后面必须跟上action动作
END模式
END就是awk结束后的操作
END是awk读取完所有的文件后,再执行END模块,一般用来总结、格式化打印一个结果
特殊符号
路径相关
~ 当前登录用户的家目录,对目录操作的命令 cd ls touch mkdir find cat
- 上一次工作路径,仅仅是在shell命令行里的作用
. 当前工作路径,表示当前文件夹本身;或表示隐藏文件 .yuchao.linux
.. 上一级目录
引号相关
引号意义
在于区分一个字符串的边界
因为linux识别,命令,参数,文件对象,中间是以空格区分的
echo 'hello world'
在建立文件时不使用引号,会建立两个文件
'' 单引号、所见即所得,引号里的所有内容,原样输出
"" 双引号、可以解析变量及引用命令
`` 反引号、可以解析命令
无引号,一般我们都省略了双引号去写linux命令,但是会有歧义,比如空格,建议写引号
重定向符号
> stdout覆盖重定向
ls *.txt > all_txt.file
#无论你如何写,得到的都是最后一次写入的数据
#无论你如何写,得到的都是最后一次写入的数据
>> stdout追加重定向
ls *.txt >> all_txt.file
#追加,在文档后追加,写几次就有几个
#追加,在文档后追加,写几次就有几个
< stdin重定向
将数据交给前面的命令处理
数据流代号
0 stdin 数据输入,如键盘的输入,如文件数据的导入
1 stdout 正确输出
2 stderr 错误输出
1 stdout 正确输出
2 stderr 错误输出
2> stderr重定向
2>&1
#注意使用方法。写在最后面
#把stderr当做stdout进行处理
ls /etc/weqwwqq > 1.txt 2>&1
命令执行
command1 && command2 # command1成功后执行command2
make && make install
#make执行完成之后再执行make install
#make执行完成之后再执行make install
必须上一个的命令正确执行,下一个命令才会执行
command1 || command2 # command1失败后执行command2
#如果第一个执行成功,第二个命令不执行
command1 ; command2 # 无论command1成功还是失败、后执行command2
#作用就是执行多个Linux命令,无论对错
\ # 转义特殊字符,还原字符原本含义
#需要和双引号结合使用
$() # 执行小括号里的命令,优先执行()内的内容
`` # 反引号,和$()作用一样
`` # 反引号,和$()作用一样
#当你进行引号嵌套时,请你这样用,
#最外层用双引号,内层用单引号
而且文件名最好不要出现空格
#最外层用双引号,内层用单引号
而且文件名最好不要出现空格
touch "nginx_`date '+%F#%T'`.log"
#最好使用共同的模式,好去执行awk等进行批量处理
#最好使用共同的模式,好去执行awk等进行批量处理
| # 管道符,对命令的结果进行多次加工
{} # 生成序列
生成英文字母序列,数字序列,用于文件拷贝的文件名简写
易踩坑的点
务必使用双引号,别用无引号
#可能会出现如下的状况
touch now_`date '+%F %T'`.log
touch now_`date '+%F %T'`.log
#没有双引号,此时文件夹会生成两个文件,应为 date '+%F %T'
输出的结果会出现一个空格,最后touch会当成两个文件处理。
输出的结果会出现一个空格,最后touch会当成两个文件处理。
#因此,在结合特殊命令时,请加上双引号,表示限定字符串区间
有linux命令、或者变量、特殊转义符等,用双引号
都会优先用双引号,因为能识别特殊符号,可以做很多事
# 符号
- 配置文件注释符号
- shell命令注释符号
- shell命令注释符号
一些常见用法
简写备份
cp /etc/resolv.conf{,.ori}
使用应用命令东西
$() 和反引号 ` `
$() 和反引号 ` `
文件名中有空格,会不认识,找不到对应文件
&& 和 || 的区别
一个是前面的命令执行成功才执行,一个是执行失败才执行
0 条评论
下一页