Linux三剑客
bash命令执行顺序
- 把命令行分成单个命令词
- 展开别名
- 展开大括号的声明({})
- 展开波浪符声明(~)
- 命令替换$0和")
- 再次把命令行分成命令词
- 展开文件通配(*、?、[abc]等等)
- 准备I/0重导向(<、>)
- 运行命令
文件查找
非实时搜索locate
速度快
- 更新updatabase
实时搜索工具find
搜索速度略慢
精确查找
只能搜索用户具备读取和执行权限的目录
sed(Stream EDitor):
sed后字符使用单引号
语法:sed [-hnV][-e<script>][-f<script文件>][文本文件]
demo: sed -n '22,$p' test
指令解释:常用选项[-n],‘地址定界[22,$],编辑命令[p]’
地址定界:
-
不给地址: 全文处理
-
单地址
#:
指定行$:
最后一行/pattern:
正则匹配
-
地址范围
#,#
,如1,20
即1-20行- e.g.
sed -n '22,$p' test
- e.g.
#,+#
,如2,+20
即2-2+20 行#;#
如3;5
即第3和第5行/pat1/,/pat2/
#,/pat1/
-
步进~
- 1~2 奇数行
sed -n "1~2p" f1
- 2~2 偶数行
- 1~2 奇数行
-
正则
-
sed ‘/regex expression/[option] text’ filename
-
^匹配每一行的开头
-
$匹配行的结尾
-
匹配包含2、3、或者4的行
sed -n '/[234]/p' employee.txt
-
删除所有以#开头的行
**sed -e 's/^#./*// ; /^$/d' employee.txt**
-
删除所有注释和空行
sed -e 's/#.*//;/^$/ d' /etc/profile
-
只删除注释行不删除空行
sed '/^#.*/d' /etc/profile
-
常用选项
-
-n
不自动打印 -
-f
指定文件中读取编辑脚本-
script.txt
1
2~2p
sed -n -f script.txt f1
-
-
-r
支持使用拓展正则表达式sed -r 's/(GRUB_CMDLINE_LINUX.*)"$//1 xyz"/'/etc/default/grub
echo"/etc/sysconfig/network/" | sed -r 's/(.*//)([^/]//?$)//1/'
-
-i.bak
生成备份文件bak并原处编辑- 如果没有-i表示只是预览,不会真正执行
-
-e
多点编辑,即多次处理文件 -
-e <script>
或--expression=<script>
以选项中指定的script来处理输入的文本文件。 -
-E
是与BSD sed兼容的未记录的选项,在BSD中sed用于支持扩展的正则表达式。
编辑动作命令
-
d删除末世空间匹配的行,并启用下一轮循环
sed -n 'd' test
全删sed -n '1d' test
只删第一行
-
p打印当前模式空间内容,追加到默认输出后
-
a[/]test
指定行追加 -
i[/]test
行前插入 -
c[/]test
替换行为单行或多行 -
= 为模式空间中的行打印行号
- sed -n ‘3,5{=;p}’ test
-
! 模式空间中匹配行取反
-
w/path/somefile:保存模式匹配的行至指定文件
r/path/somefile:读取指定文件的文本至模式空间中匹配到的行后sed'/User/r sed.txt' .bashrc
-
搜索代替
-
1
2
3sed 's/xxx/xxx/' filename
# sed 's@xxx@xxx' filename
# sed 's#xxx#xxx' filename -
替换标记:
g:行内全局替换
p:显示替换成功的行
W/PATH/TO/SOMEFILE:将替换成功的行保存至文件中
-
以下命令如果需要在文本中更改 需要加 -i 或者 -ri参数
用sed在aaa前加#注释
1 | sed 's/^aaa/#&/' zimu.txt # &的意思是匹配任意字符(就是说未知数,啥都行) 这条命令是 替换以aaa开头的 |
用sed取消bbb前面的注释
1 | sed 's/^#(bbb)//1/' zimu.txt #/1的意思 就类似于 前面的 (bbb/) /1就是复制这个位置的内容 如果有 第二个 那么久/2就是复制第二个位置的内容 |
附录:
<<<
:sed 's/g/dddd/' <<< "ghhhg"
->ddddhhhgvar=hello
,sed 's/e/dddd/' <<< "$var"
-> hddddllo
awk
优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一
ifconfig获得ip_addr的命令
1.ifconfig | grep inet | awk '{print $2}' | awk -F 'addr:' '{print $2}'
2.ifconfig | grep addr:192.168.* | awk '{print$2}' | awk '{split($0,a,/":/");print(a[2])}'
▲.尽量使用单引号''
,而不是""
-F分隔符
e.g.echo "A|B|C|D" | awk -F "|" '{print($1)}'
NF列的个数
awk -F: '$3<10{print $1 <====> $NF}' /etc/passwd
{}中的内容为要要执行的内容
NR当前行号
linux单双引号区别
双引号:把双引号的内容输出出来;如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来。双引号内命令或变量的写法为命令或变量或$(命令或变量)
单引号:所见即所得,将单引号内的内容原样输出,阻止所有字符的转义
不加引号:不会将含有空格的字符串视为一个整体输出,如果内容中有命令,变量等,会先把命令,变量解析出结果,然后再输出最终内容来,如果字符串含有空格等特殊字符,则不能完整输出,则需改加双引号。
倒引号(反引号Esc键下方):进行命令的替换,在倒引号内部的shell命令将会被执行,其结果输出代替用倒引号括起来的文本。
echo "1111/n222"
不会转移/n
echo -e "11111/n222"
会转义/n
xargs -n1
每行1个元素;xargs -n2 每行2个元素;
grep(Globally search a Regular Expression and Print)
一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行
常见命令ps -aux | grep xxxx
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
-x --line-regexp : 只显示全列符合的列。
Author: Mrli
Link: https://nymrli.top/2019/08/30/Linux三剑客/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.