三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

linux基础随心记三-四剑客

linux基础随心记三-四剑客

一、正则表达式

1、特殊符号

引号
单引号内容原封不动的输出
双引号会解析一些特殊符号,但对于{}(通配符)没有解析
不加引号和双引号类似,额外支持通配符 *.log {1…10}
反引号优先执行反引号内的命令
重定向
>标准正确输出,先清空后写入
>>追加
2>标准错误输出
2>&1 &>xxx.logecho xkm >>xkm.log 2>&1
echo xkm &>>xkm.log
<标准输入
<<cat xxx.txt <<EOF
xxxx
EOF
通配符用于批量处理文件
*所有
{}输出序列
[]
?任意一个字符

2、正则表达式

配合三剑客使用正则对字符进行过滤
正则表达式在线测试

基础正则
^xxx以xxx开头
xxx$以xxx结尾 cat -A 显示文件中隐藏的特殊符号
^$空行
.任意一个字符
\转义字符 ‘\.$’ 以.结尾
x*前一个字符连续出现0次或0次以上
.*所有
[]匹配任意一个字符 [abc] a或者b或者c
不需要转义,与+搭配较多
[^]取反 [^abc] 匹配任意一个字母,除了abc
扩展正则egrep 或 grep -E
sed -r
awk默认支持
+前一个字符连续出现1次或1次以上
[0-9]+ 取出所有的数字
[a-Z]+ 取出所有的单词
|或者
()表示一个整体
或在sed中实现后向引用(反向引用sed)
{}a{n,m} 前一个字符连续出现至少n次,最多m次
a{n} 前一个字符连续出现n次
a{n,} 前一个字符连续出现至少n次
a{,m}前一个字符连续出现最多m次
前一个字符出现0次或1次
perl正则grep -P
\d[0-9]
\s匹配的空字符 空格 tab \ \t \r \n \f
\w[0-9a-zA-Z_]
\D[^0-9]
\s非空字符
\W[^0-9a-zA-Z_]

二、gerp

  • 擅长过滤,过滤速度最快,会把匹配到的行显示出来
选项说明
-n显示行号
-i不区分大小写
-v排除
# 显示/etc/下面一层中以.conf结尾的文件ls/etc/|grep'\.conf$'find/etc/-maxdepth1-typef-name'*.conf'# 使用grep取出/etc/passwd第一列的数据egrep-o'^[^:]+'/etc/passwd

三、sed

  • 擅长取行,过滤,增删查改(替换修改文件内容)
  • 后向引用(截取)
-n取消默认输出,有p输出时要加上-n,不然会全部输出
-r支持扩展正则
-i修改文件内容,这个选项要放在最后
-i.bak先进行备份,然后修改文件内容,这个选项要放在最后

1、查找

  • 精确查找 类似于grep的过滤,但是可以指定行号
  • 模糊查找
# 取出文件的第三行sed-n'3p'/etc/passwd# 取出文件的第2到5行sed-n'2,5p'/etc/passwd# 取出文件的第2行和第5行sed-n'2p;5p'/etc/passwd# 取出文件的最后一行sed-n'$p'/etc/passwd# 过滤出包含root的行sed-n'/root/p'/etc/passwd# 获取范围内的日志sed-n'/11:00:00/,/24:00:00/p'/var/text.log

2、替换

格式: sed ‘s#找谁#替换成什么#g’ 文件名 输出文件内容
sed -i ‘s#找谁#替换成什么#g’ 文件名 修改文件内容
s:substitute 替换
g:global 全局替换,把一行中所有匹配到的内容都进行替换,否则只替换每一行第1个匹配到的内容

3、替换进阶-后向引用

适用于sed命令处理/提取一行中的某一部分,配合正则灵活取列

# \+数字 调用前面的组echo1234567|sed-r's#(1)(.*)(7)#\1<\2>\3#g'1<23456>7# 调换/etc/passwd第一列和最后一列的内容sed-r's#(^.*)(:x.*:)(.*$)#\3\2\1#g'/etc/passwdsed-r's#([a-zA-Z0-9_-]+)(.*:)(.*$)#\3\2\1#g'/etc/passwd# 提取网卡ipipa s eth0|sed-nr'3 s#(^[a-z]+ )(.*)(/.*)#\2#g p'

4、删除

d 删除以为单位
sed ‘3d’ xkm.log
删除空行或带#的行
sed -r ‘/^$|#/d’ xkm.log

5、增加

  • cai
    a:append 在指定行后面追加内容
    i:insert 在指定行上面插入一行
    c:replace 替换指定行的内容,取代

sed ‘3a xxx’ xkm.log

四、awk

是一个单行脚本
取行、取列、混合取行与列、统计功能、判断与循环、数组
擅长取列
‘条件{动作}’

1、取行

# 取出第一行awk'NR==1{print $0}'/etc/passwdawk'NR==1'/etc/passwd# NR Number of Record 记录号,行号# 取出第2到5行awk'NR>=2 && NR<=5'/etc/passwd# 过滤出包含root或nobody的行awk'/root|nobody/'/etc/passwd# 过滤出包含从root到nobody的行awk'/root/,/nobody/'/etc/passwd

2、取列

$数字 表示取列,$1第一列,$0表示这一行
$NF 最后一列 Number of Field
$(NF-1) 倒数第二列
column -t 对齐
-F 指定分隔符 -F:
$4 ~ /^[01]/ 第4列包含0或1开头( ~ 对某列进行过滤)

# 取出ls -lh的size列和最后一列ls-lh|awk'{print $5,$NF}'# 指定复杂分隔符取ipipa s eth0|awk-F'[ /]+''NR==3{print $3}'# 判断第三列大于1000,取出第一列,第三列和最后一列awk-F:'$3>1000{print $1,$3,$NF}'/etc/passwd# 过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第一列,第三列awk-F:'$4 ~ /^[01]/ {print $1,$3}'/etc/passwd

3、统计与计算

  1. 类似wc -l
awk'{i++} END{print i}'/etc/passwd
  1. 进行累加求和
awk'{i=i+$1} END{print i}'/etc/passwd

五、find

擅长在指定目录中查找文件

选项说明
-type什么类型的文件 f表示文件 d表示目录
-name要查找的文件的名称
-size根据大小查找文件 +表示大于 -表示小于
-mtime根据修改时间查找文件,+ 或 - 表示在指定天数内或后
-user根据所属用户
-maxdepth指定深度,写在最前面
# 对查找到的每个文件执行指定的命令find/var/log/app-name'*.log'-matime+7-execrm-f{}\;# 将查找到的所有文件作为参数传递给指定的命令,而不是逐个执行find/var/log/app-name'*.log'-matime-7-exectarzcf /var/log/app.tar.gz{}+
← 返回列表