管道
Linux提供管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边的命令的输入:
例:echo "hello1234" | grep 'hello'
正则表达式
正则表达式就是记录文本规则的代码
常见的元字符:
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白字符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
常见的限定符:
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
- 找出所有的hi单词
-\bhi\b
- hi单词后面有lucy单词
-\bhi\b.*\blucy\b
- 以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字
-0\d{2}-\d{8}
grep
根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
命令形式:grep
[OPTIONS]PATTERN
[FILE…]
-
-v显示不被pattern匹配到的行
-
-i忽略字符大小写
-
-n显示匹配的行号
-
-c统计匹配的行数
-
-o仅显示匹配到的字符串
-
-E使用ERE,相同于egrep 6.
🌰查找文件内容包含root的行数
grep -n root test.txt
🌰查找文件内容不包含root的行
grep -nv root test.txt
🌰查找以s开头的行
grep ^s test.txt
🌰查找以n结尾的行
grep n$ text.txt
sed
sed是流编辑器,一次处理一行内容
命令形式:sed
[-hn…][-e<script>][-f<script FILE>][FILE]
- -h显示帮助
- -n仅显示script处理后的结果
- -e<script>以选项中指定的script来出来输入的文本文件
- -f<script FILE>以选项中指定的script文件来处理输入的文本文件
常见的动作:
代码 | 例子 | 说明 |
---|---|---|
a | sed -e ‘4 a newline’ | 第4行后面新增一行newline |
c | sed -e ‘2,5 c No 2-5 number’ | 用c后面的内容取代2到5行的内容 |
d | sed -e ‘2,5d’ | 删除2到5行的内容 |
i | sed -e ‘2i newline’ | 在第2行前面插入newline |
p | sed -n ‘/root/p’ | 打印匹配到root的内容 |
s | sed -e ‘s/old/new/g’ | 用new取代old的内容,/g代表全局 |
练习
- 查看帮助
- man sed
- sed -h
- 在第四行后添加新字符串
- sed -e ‘4 a newline testfile’ test.txt
- sed -e ‘4 a newline testfile’ test.txt
- 在第二行前加上newline
- sed ‘2i drink tea’ test.txt
- sed ‘2i drink tea’ test.txt
- 全局替换
- sed -e 's/root/hello/g’test.txt
- sed -e 's/root/hello/g’test.txt
- 直接修改文件内容
- sed -i ‘s/root/hello/g’ test.txt
- sed -i ‘s/root/hello/g’ test.txt
使用Mac操作的时候报错
sed: 1: “4 a newline”: command a expects \ followed by text
- 解决方案1:调整mac下sed的用法,使其与Linux一致
mac上安装gnu-sedbrew install gnu-sed alias sed=gsed
- 解决方案2:用法区别参考
awk
把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理
常用参数:
代码 | 说明 | 代码 | 说明 |
---|---|---|---|
FILENAME | awk浏览的文件名 | OFS | 输出域分隔符 |
BEGIN | 处理文本之前要执行的操作 | ORS | 输出记录分隔符 |
END | 处理文本之后要执行的操作 | RS | 控制记录分隔符 |
FS | 设置输入域分隔符,等价于命令行-F选项 | $0 | 整条记录 |
NF | 浏览记录的域的个数(列数) | $1 | 表示当前行的第一个域…以此类推 |
NR | 已读的记录数(行数) |
练习
- 打印匹配到ll的第二行内容
- awk ‘/ll/{print $2}’ test.txt - sed -h
- awk ‘/ll/{print $2}’ test.txt - sed -h
- 打印第二行内容
- awk ‘NR==2{print $0}’ test.txt
- awk ‘NR==2{print $0}’ test.txt
- 使用begin加入标题
- awk ‘BEGIN{print “begin”,“BEGIN”}{print $1,$2}’ test.txt
- awk ‘BEGIN{print “begin”,“BEGIN”}{print $1,$2}’ test.txt
- 自定义分割符
- awk ‘BEGIN{RS=" "}{print $1}’ test.txt
- awk ‘BEGIN{RS=" "}{print $1}’ test.txt