文章目录
- 1 管道符--- "|"
- 2 重导向--- ">、>>、<"
- 3 Linux shell的&&和||
- 4 参数替换---xargs
- 5 基本功能转换---tr
- 6 提取文本文件数据的指定列---cut
- 7 去重----uniq
- 8 硬件信息及其他系统信息
1 管道符— “|”
管道符(pipe)用 “|” 这个界定符号表示,如果需要对linux命令的输出结果进行再次处理,就可以使用管道符+管道命令解决。 管道符 “|” 仅能处理由前一个命令执行后传来的正确信息,如果命令执行异常,无法对异常信息进行处理。
例如:通过ps命令可以查看系统中的进程,但如果需要查看指定进程,就需要在ps命令返回的结果中进行筛选,如查看java进程:
ps -aux | grep java
1.1 管道符的用法
bash命令 | 管道命令
以上用法中提到的"管道命令",是指该命令必须能够接收标准输出,这样的命令才是管道命令,例如grep,less,head,tail等命令。以下列出部分管道命令的分类。
- 选取命令:cut,grep
- 排序命令:sort,wc,uniq
- 双向重定向:tee
- 字符转换命令:tr,col,join,paste,expand
- 切割命令:split
- 参数代换命令:xargs
管道 “|” 可将命令的结果输出给另一个命令作为输入之用:
man mtools|grep mbadblocks (在mtools的帮助中搜索包含“mbadblocks”的句子)
man mtools|less
把输出用管道导入到一个叫做 less 的工具
less 是一个分页工具,它允许你一页一页地查看信息
管道符号的好处
# 求和
[root@fyr ~]# seq -s+ 100 //中间加上加号
[root@fyr ~]# seq -s+ 100 >log.txt //将log.txt中的信息交给bc 计算
[root@fyr ~]# bc < log.txt //bc就是计算命令
[root@fyr ~]# seq -s+ 100|bc //写脚本
2 重导向— “>、>>、<”
重导向就是使命令改变它所认定的标准输出。
“>” 可将结果输出到文件中,该文件原有内容会被删除
“>>” 则将结果附加到文件中,原文件内容不会被删除
“<” 可以改变标准输入。如:
[root@fyr ~]# cat 1.txt >> 2.txt
#将1.txt文件的内容加在2.txt文件的后面
2.1 输出重定向
1.命令 >> 文件 2>&1:以追加的方式,把正确输出和错误输出都保存在文件中
2.命令&>文件名:以覆盖的方式将正确和错误输出都保存在文件中
3.命令&>>文件名:以追加的方式将正确和错误输出都保存在文件中
4.命令>>文件A 2>>文件B:正确的输出到 A 文件中,错误的输出到 B 文件中
注意:只要涉及到错误输出,> 或者 >> 两侧都不能有空格。
2.2 连接符号— “;”
当有几个命令要连续执行时,我们可以把它们放在一行内,中间用 “;” 分开。
mkdir myfile;cp /tmp/myfile.txt myfile
#先建立一个目录myfile
#然后把myfile.txt拷贝到新建的目录中
2.3 后台执行— “&”
用户有时候执行命令要花很长时间,可能会影响做其他事情。最好的方法是将它放在后台执行。后台运行的程序在用户注销后系统还可以继续执行。当要把命令放在后台执行时,在命令的后面加上"&"。
3 Linux shell的&&和||
shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。
当 $? == 0 时,表示执行成功;当 $? == 1 时,表示执行失败。
shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。
3.1 &&(命令执行控制)
语法格式如下:
command1 && command2 [&& command3 ...]
#命令之间使用 && 连接,实现逻辑与的功能。
#只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
#只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
3.2 ||(命令执行控制)
语法格式如下:
command1 || command2 [|| command3 ...]
#命令之间使用 || 连接,实现逻辑或的功能。
#只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
#只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
shell 提供了两种方法(() 和 {})实现将几个命令合作一起执行,代替独立执行。这种方式并不能控制命令是否需要执行,仅是将多个单独的命令组合在一起执行,最终命令的返回值将由最后一条命令的返回值来决定。
3.3 () (命令组合)
语法格式如下:
(command1;command2[;command3...])
# 一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符(;)分隔。执行的效果等同于多个独立的命令单独执行的效果。
# () 表示在当前 shell 中将多个命令作为一个整体执行。需要注意的是,使用 () 括起来的命令在执行前面都不会切换当前工作目录,也就是说命令组合都是在当前工作目录下被执行的,尽管命令中有切换目录的命令。
# 命令组合常和命令执行控制结合起来使用。
4 参数替换—xargs
由于很多命令不支持管道来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数
另外,许多命令不能接受过多参数,命令执行可能会失败,xargs 可以解决
注意:文件名或者是其他意义的名词内含有空格符的情况
举例一:
单独使用 xargs是将键盘上的输入输出在屏幕上
[root@localhost opt]# ls /opt
10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
#我不想固定后面的参数 /opt 我想把后面的参数使用命令生成变成活的
#简单来说就是只要可以加参数的命令后面的参数是可以使用xargs灵活改变的
#xargs默认 是读取键盘输入在输出出来,把输入的东西 传给下一个命令作为参数
[root@localhost opt]# xargs 或xargs echo(echo可以省略)
333
333
举例二:seq打印出10
[root@localhost opt]# seq 10
[root@localhost opt]# seq 10 |xargs 取消换行
1 2 3 4 5 6 7 8 9 10
[root@localhost opt]# seq 10 |xargs -n1 处理一个参数换行一次
举例三:将显示的结果全部删除
#不支持标准输出重定向
[root@localhost opt]# ls *.txt |rm
rm: 缺少操作数
Try 'rm --help' for more information.
[root@localhost opt]# touch {1..10}.txt
#
[root@localhost opt]# ls *.txt |xargs rm //将显示的结果全部删除
find 经常和 xargs 命令进行组合,形式如下:
[root@fyr opt]# find /etc/ -type d | wc -l
[root@fyr opt]# find /etc/ -type f | wc -l
[root@fyr opt]# find /etc/ ! -type f | wc -l
5 基本功能转换—tr
格式:tr [选项]... SET1 [SET2]
SET 是一组字符串,一般都可按照字面含义理解
-d | 删除 |
---|---|
-s | 压缩 |
案例一
[root@localhost ~]# tr 123 abc //只要出现123 就转换成abc
[root@localhost ~]# tr 12345678 abc //最后一个一直用
[root@localhost ~]# tr -d abc //删除
2a34bc
234
[root@localhost ~]# tr -s " "
1 2 3 4
1 2 3 4
[root@localhost ~]# tr -s "a"
案例二:面试题生成随机密码
[root@fyr ~]# cat /dev/urandom |tr -dc '[:alnum:]' | head -c12
案例三
[root@fyr ~]# cat 1.txt
aaaaa 11111
bbbbb 22222
[root@fyr ~]# cat 1.txt |tr -c "[a-z]" " " //用 空格替换除了小写字母之外的所有字符
[root@fyr ~]# cat 1.txt |tr -sc "[a-z]" " " //加s压缩
6 提取文本文件数据的指定列—cut
格式:cut [选项]... [文件]...
常用选项
-d (DELIMITER) | 指明分隔符,默认tab |
---|---|
-f | 想要获取的字段。 |
-c | 取字符 |
获取的字段
#: 第#个字段,例如 3
#,#[,#]:离散的多个字段,例如 1,3,6
#-#:连续的多个字段, 例如 1-6
混合使用:1-3,7
举例一
[root@fyr ~]# cut -d : -f1,3 /etc/passwd
//以冒号作为分隔的条件,取文件的第一列和第三列
案例二
[root@fyr ~]# ll | tail -n +2 | tr -s " "| cut -d " " -f3,9
//从第二行开始,将空行压缩成一个后,再以空格为分隔符,取第3 和第9列
案例三
[root@fyr ~]# df | tail -n +2 | tr -s " " | cut -d " " -f5 | tr -d %
# df |tail -n +2 不显示第一行字段
# tr -s " " 将多个空格压缩成一个
# cut -d " " -f5 已空格为分隔符,取第五列
# tr -d % 删除百分号
[root@fyr ~]# df | tail -n +2 | tr -s " " % | cut -d % -f5
# df |tail -n +2 不显示第一行字段
# tr -s " " 将多个空格压缩成一个后 将空格替换成%
# cut -d % -f5 已%为分隔符 取第5列
案例四
[root@fyr ~]# df |tail -n +2 |cut -c54
#使用字符取字段,-c 取当前字符的字段
#在xshell的左下角,复制会有字符个数
7 去重----uniq
格式:uniq [OPTION]... [FILE]...
-c | 显示每行重复出现的次数 |
---|---|
-d | 仅显示重复过的行 |
-u | 仅显示不曾重复的行 |
uniq常和sort 命令一起配合使用
案例一
[root@fyr ~]# cat 1.txt
[root@fyr ~]# uniq 1.txt //只会将连续的行去重
[root@fyr ~]# uniq -c 1.txt //显示出现次数
案例二:面试题,查看访问日志,找出访问前10名的用户
[root@localhost ~]# cat log|cut -d" " -f1
#先取地址
[root@localhost ~]#cat log | cut -d" " -f1 | sort
#再排序一样的ip地址在一起
[root@localhost ~]#cat log | cut -d" " -f1 | sort | uniq -c
#去重
[root@localhost ~]#cat log | cut -d" " -f1 | sort | uniq -c | sort -nr | head
#再数字排序,取前10 行
案例三:面试题 取两个文件一样或不一样的字段
[root@fyr ~]# cat 1.txt 2.txt
[root@fyr ~]# cat 1.txt 2.txt | uniq -d //直接使用 看不出来
[root@fyr ~]# cat 1.txt 2.txt | sort | uniq -d //一样的
[root@fyr ~]# cat 1.txt 2.txt | sort | uniq -u //不一样的
8 硬件信息及其他系统信息
8.1查看cpu—lscpu或cat /proc/cpuinfo
cat /proc/cpuinfo也可看查看到
[root@fyr ~]# lscpu
[root@fyr ~]# cat /proc/cpuinfo
8.2 查看内存大小—free或cat /proc/meminfo
[root@fyr ~]# free
[root@fyr ~]# cat /proc/meminfo
8.3查看硬盘和分区情况—lsblk或cat /proc/partitions
[root@fyr ~]# lsblk
[root@fyr ~]# cat /proc/partitions
8.4 查看机器架构—arch
[root@fyr ~]# arch
8.5 查看内核版本—uname -r
[root@fyr ~]# uname -r
8.6系统时间—date
date查看当前系统时间
-d | 你描述的日期,显示指定字符串所描述的时间,而非当前时间 |
---|---|
%F | 完整日期格式,等价于 %Y-%m-%d |
%T | 时间(24小时制)(hh:mm:ss) |
[root@fyr ~]# date -d '-1 day' +%F
[root@fyr ~]# date +%F
[root@fyr ~]# date -d '1 day ' +%F-%T
[root@fyr ~]# date -d "-3 day" 前三天
[root@fyr ~]# date -d "+3 day" 后三天