在编程中如果能够熟悉shell高阶语法,将对我们进阶为高级程序员有很大的帮助,本文将从Shell重定向 管道命令 awk编程 sed等方面展开介绍。
作者:有勇气的牛排
文章目录
-
- 1 shell重定向
-
- 1.1 输出重定向
- 1.2 /dev/null
- 2 linux管道命令
- 3 cut 列提取命令
- 4 awk命令
-
- 4.1 awk 条件
-
- 4.1.1 BEGIN
- 4.1.2 END
- 4.1.3 关系运算符
- 4.1.4 正则
- 4.2 awk 内置变量
- 4.3 awk 脚本
- 5 sed
-
- 5.1 查、删除、替换、增加、批量操作
-
- 5.1.1 查
- 5.1.2 增加
- 5.1.3 删除
- 5.1.4 替换
-
- 5.1.4.1 -e 不修改源文件
- 5.1.4.2 -i 修改源文件
- 5.1.4.3 范围替换
- 5.1.4.4 批量操作
- 5.2 搜索
-
- 5.2.1 仅搜索
- 5.2.2 搜索并执行指令
- 6 字符处理命令
-
- 6.1 sort 排序
- 6.2 uniq 取消重复行
- 6.3 wc 统计命令
1 shell重定向 通常情况下,多数unix系统命令从终端接受输入并将产生的结果输出发送回终端。
一个命令通常从一个标准输入的地方读取,这里恰好终端。同样,一个命令通常将其输出写入到标准输出,治理默认也是终端。
重定向命令列表
命令 | 描述 |
---|---|
command > file | 将输出重定向到file |
conmand < file | 将输入重定向到file |
n > file | 将文件描述符为n的文件重定向到file |
n >> file | 将文件描述符为n的文件,以追加的方式重定向到file |
n >& m | 将输出文件 m 和 n 合并 |
n <& m | 将输入文件 m 和 n 合并 |
<< tag | 将开始标记tag和结束标记tag之间的内容作为输入 |
>
:覆盖到文件>>
:追加到文件末尾实例:使用who命令,将结果保存在who.txt中
who > who.txt
1.2 /dev/null
这条命令可以让执行的命令,不在屏幕上显示结果(类似于禁止输出),其本质为写一个特殊的文件,但是写的文件都会被抛弃。
who /dev/null
2 linux管道命令
- 符号:
|
- 管道命令能且仅能处理经由前一个命令传来的正确信息。(不处理错误输出)
- 在每个管道符号后面接的第一个参数一定是命令,并且该命令必须能够接收标准输入
ls | cat > dirinfo.txt
文章图片
实例2:查询指定字符
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子,丹丘生,将进酒,君莫停。
与君歌一曲,请君为我侧耳听。
钟鼓馔玉不足贵,但愿长醉不愿醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。
cat gushi.txt | grep "请君为我侧耳听"
文章图片
实例3:生成一个8位随机密码
tr -dc A-Za-z0-9_
3 cut 列提取命令 语法:
cut [选项] 文件名
-f
:列号:提取第几列-d
:分割符:按照指定分隔符分割列,默认为 “tab” 制表符-n
:取消分割多字节字符-c
:字符范围:不依赖分隔符来区分,而是通过字符范围(行首为0)来进行字段提取。“n-”表示从第n个字符到行尾;
“n-m”从第n个字符到第m个字符;
“一m”表示从第1个字符到第m个字符。--complemment
:补足被选择的字节、字符或字段--out-delimiter
:指定输出内容是的字段分割符students.txt
idnamescore
1Charles 100
2Tom99
3Lisa99
实例:提取第2、3列内容
cut -f 2,3 student.txt
文章图片
实例:提取每行前2个字符
cut -c -2 student.txt
实例:提取第2到最后一个字符
cut -c 2- student.txt
cat student.txt | cut -d " " -f 1,2
4 awk命令 AWK是处理文本文件的语言,是一个强大的文本分析工具。
- 多个条件使用{ }进行分割,也可以使用回车符进行分割
- 如需执行多个命令,可使用回车或
;
进行分割 - 在awk中,变量的赋值与调用都不需要加入
$
符
条件 | 条件类型 | 描述 |
---|---|---|
BEGIN | awk保留字 | BEGIN作为awk的保留字,其在awk读取数据之前执行,且执行一次。 |
END | awk保留字 | END作为awk的保留字,与BEGIN的作用相反,其在程序执行结束后,执行的一次动作。 |
> | 关系运算符 | 大于 |
< | 关系运算符 | 小于 |
>= | 关系运算符 | 大于等于 |
<= | 关系运算符 | 小于等于 |
== | 关系运算符 | 判断是否相等 |
!= | 关系运算符 | 不等于 |
A=B | 关系运算符 | 判断字符串中是否包含B表达式的字串 |
A!=B | 关系运算符 | 判断字符串中是否不包含B表达式的字串 |
/正则/ | 正则表达式 | 正则 |
实例:
awk 'BEGIN{printf "先执行我这哦\n"} {printf $2"\n"}' student.txt
文章图片
4.1.2 END END作为awk的保留字,与BEGIN的作用相反,其在程序执行结束后,执行的一次动作。
实例:
awk 'END{printf "程序执行完毕,执行这里哈\n"} {printf $2 "\t" $3 "\n"}' student.txt
文章图片
4.1.3 关系运算符 实例
cat student.txt | grep -v score | awk '$3 > 99 {printf $2 "\t" $3 "\n"}'
4.1.4 正则 实例:打印Chrles的信息
awk '/Charles/ {print}' student.txt
4.2 awk 内置变量
内置变量 | 描述 |
---|---|
$0 | 打印所有数据 |
$n | 当前记录的第n列字段 |
NF | 当前所在行总字段数 |
NR | 当前所在行的行号 |
… | … |
# 打印所有数据
awk '{print $0}' student.txt
# 当前记录的第n列字段
awk '{print $n}' student.txt
# 当前所在行总字段数
awk '{print NF}' student.txt
# 当前所在行的行号
awk '{print NR}' student.txt# 打印文本文件的总行数
awk 'END{print NR}' student.txt
# 打印文本第一行
awk 'NR==1{print}' student.txt
# 打印文本第二行第一列
sed -n "2, 1p" student.txt | awk '{print $1}'# 进程查看
ps -aux | grep watchdog
# 进程查看 获取第1、2、3列
ps -aux | grep watchdog | awk '{print $1"\t"$2"\t"$3}'
# 进程查看 第一行 获取第1、2、3列
ps -aux | grep watchdog | awk 'NR==1{print $1"\t"$2"\t"$3}'# 获取行数
df -h | awk 'END{print NR}'# 获取最后一行的列数
ps -aux | grep watchdog | awk 'END{print NF}'
# 获取最后一列
ps -aux | grep watchdog | awk 'END{print $NF}'
4.3 awk 脚本
对于简单的命令可以在命令行中解决,但是面对大量从操作时,写成脚本就非常中重要了。
使用
-f
进行调用print.awk
{print $1"\t"$2"\t"$3}
ps -aux | grep watchdog | awk -f print.awk
5 sed sed命令是利用脚本来处理文本文件,并且可以按照执行编辑文本文件。
参数说明:
-e或--expression= 以选项中指定的script来处理输入的文本文件。
-f或--file= 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!
5.1 查、删除、替换、增加、批量操作
注:这里
nl
与cat
效果相同5.1.1 查 实例:查询第2行记录
sed -n '2p' student.txt
文章图片
实例:查询2~4行
sed -n '2,4p' student.txt
文章图片
5.1.2 增加 实例:在第二行前 插入 ccc,并标准输出
nl student.txt | sed '2i ccc'
文章图片
实例:在第二行后 插入 ccc,并标准输出
nl student.txt | sed '2a ccc'
文章图片
5.1.3 删除 实例:删除3~4行,并标准输出
nl student.txt | sed '3,4d'
文章图片
实例:删除第3~最后一行,并标准输出
cat student.txt | sed '3,$d'
文章图片
5.1.4 替换 5.1.4.1 -e 不修改源文件
idnamename2score
1cccc100
2aamy99
3bbby92
4ccna96
5yydd98
【linux|Linux Shell重定向 管道命令 awk编程 sed文件操作高阶函数】语法:
sed s/被替换的字符串/新字符串/g
实例1:将每行第一次出现的
cc
替换为导演
,并标准输出sed -e 's/cc/导演/' student.txt
文章图片
实例2:基于实例1,替换所有符合条件的
sed -e 's/cc/导演/g' student.txt
文章图片
5.1.4.2 -i 修改源文件 用法同
-e
,区别在于是否修改源文件。# 将每行第一次出现的 cc 替换为导演
sed -e 's/cc/导演/' student.txt# 将所有的 cc 替换为导演
sed -e 's/cc/导演/g' student.txt
5.1.4.3 范围替换 实例:将 2~5行替换为空
nl student.txt | sed '2,5c 空空空'
文章图片
5.1.4.4 批量操作 将当前目录所有
stu
开头的文件进行操作sed -i 's/导演/cc/g' stu*
5.2 搜索
idnamescore
1Charles 100
1Charles_a 99
3Lisa92
2Tom99
3Lisa_b95
5.2.1 仅搜索 实例:搜索包含
cc
的记录,并标准输出。cat student.txt | sed -n '/cc/p'
5.2.2 搜索并执行指令 实例:搜索第一个匹配到的
cc
记录,并且将第一个cc
替换为`导演,最后标准输出。cat student.txt | sed -n '/cc/{s/cc/导演/;
p;
q}'
文章图片
实例:搜索所有含有cc的记录,将第一个出现的
cc
替换为导演
,并标准输出。cat student.txt | sed -n '/cc/{s/cc/导演/;
p}'
文章图片
6 字符处理命令 6.1 sort 排序
语法:
sort [选项] 文件名
-b: 忽略每行前面的空格字符
-c: 检查文件是否已经按照顺序排序
-d: 处理英文字母、数字及空格字符外,忽略其他的字符
-f: 忽略大小写
-i: 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-n: 以数值型进行排序,默认使用字符串型排序
-r: 反向排序
-u: 删除重复行。就是uniq命令
-t: 指定分隔符,默认是分隔符是制表符
-k n[,m]: ―按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
6.2 uniq 取消重复行
语法:
uniq [选项] 文件名
-i
:忽略大小写实例
sort -n student.txt | uniq
6.3 wc 统计命令
语法:
wc [选项] 文件名
选项:
-l:只统计行数
-w:只统计单词数
-m:只统计字符数
统计:student.txt
[root@master shell]# wc student.txt
6 24 76 student.txt
行数为6、单词数24、字节数76
推荐阅读
- 压力测试|【测试基础】jmeter工具介绍及使用方法
- 09_Linux基础-SHELL-标准输入与标准输出-重定向-管道
- 07_Linux基础-计划任务-备份脚本-变量定义和使用
- 08_Linux基础-vim-tmux-字符编码
- linux 安装minio并设置开机自启动
- Github加速的10种方式
- 项目实战|[笔记]Qt5+FFMpeg+Opencv 实现实时美颜直播推流《一》基础知识以及直播服务器配置
- 数据库|SQL SERVER数据库使用过程中系统提示死锁处理办法
- linux|Linux的防火墙相关操作