Linux常用命令(输入输出处理)

Linux常用命令(博客地图):https://blog.csdn.net/sysukehan/article/details/105804511

 

1、数据流重定向

命令执行过程的数据传输情况:

file --Standard input-→Command –Standard output-→ file/device

                                            |

                                 Standard error

                                            |

                                    file/device

在执行一个命令时,命令可能由文件读入数据,经过处理之后,再将数据输出到屏幕上。standard output与standard error output分别代表“标准输出”与“标准错误输出”,这两个命令默认都是输出到屏幕上面。

标准输出:命令执行所回传的正确的信息。

标准错误输出:命令执行失败后,所回传的错误信息。

举例来说,系统有/etc/ssh/ssh_config文件但没有/etc/ssh/ssh_config1文件,此时如果执行cat /etc/ssh/ssh_config和cat /etc/ssh/ssh_config1命令,cat会进行:

标准输出:读取/etc/ssh/ssh_config文件后将内容显示在屏幕上。

标准错误输出:找不到/etc/ssh/ssh_config1文件,屏幕上显示错误信息。

不管正确与否信息都会输出到屏幕上。通过某些机制把标准输出和标准错误输出分开就是数据流重定向的功能。数据流重定向可以将standard output(简称stdout)与standard error output(简称stderr)分别传送到其他的文件或设备去,分别传送所用的特殊字符如下所示:

1、标准输入(stdin):代码为0,使用<或<<;

2、标准输出(stdout):代码为1,使用>或>>;

3、标准错误输出(stderr):代码为2,使用2>或2>>;


内容写入的过程是:

1、文件(例子中为testfile1.txt)若不存在,则自动创建文件;

2、当这个文件存在的时候,系统会先将这个文件内容清空,然后再将数据写入;

3、也就是若以>输出到一个已存在的文件中,那个文件就会被覆盖掉;

如果不想覆盖已有的内容,可以使用>>,这样新的内容会追加在已有内容的下一行。


如果是要输出错误信息,则使用2>或2>>,差别在于是要覆盖已有内容还是追加。


也就是说:

1>或>:以覆盖的方法将正确的数据输出到指定的文件或设备上;

1>>或>>:以追加的方法将正确的数据输出到指定的文件或设备上;

2>:以覆盖的方法将正确的数据输出到指定的文件或设备上;

2>>:以追加的方法将正确的数据输出到指定的文件或设备上;

将正确信息和错误信息分别存入不同文件的方法:

find /home -name .bashrc > list_right 2> list_error

在屏幕上只显示正确信息,忽略错误信息:

find /home -name .bashrc 2> /dev/null

/dev/null是黑洞设备,可以吃掉所有导向这个设备的信息。

把正确信息和错误信息都写到一个文件中的写法:

错误示例:find /home -name .bashrc > list 2> list,因为两个命令对同一个文件进行读写,会造成文件中记录的次序和实际命令输出的次序不同。

正确示例: find /home -name .bashrc > list 2>&1或find /home -name .bashrc &> list

 

2、命令回传码$?、与&&、或||

命令执行结果正确,在Linux下面会回传一个$?=0的值。

cmd1&&cmd2:

若cmd执行完毕且正确执行($?=0),则开始执行cmd2.

若cmd执行完毕且为错误($?≠0),则不执行cmd2.

cmd1||cmd2:

若cmd执行完毕且正确执行($?=0),则不执行cmd2.

若cmd执行完毕且为错误($?≠0),则开始执行cmd2.

举例:

1ls /etc/ssh && touch /etc/ssh/test1.txt


屏幕不想有输出的话还可以用黑洞设备:ls /etc/ssh > /dev/null 2>&1 && touch /etc/ssh/test1.txt。先检查/etc/ssh是否存在,存在的话在下面创建一个文件test1.txt,不存在的话不创建文件。

2ls /etc/ssh/dir > /dev/null 2>&1 || mkdir /etc/ssh/dir


检查/etc/ssh/dir文件夹是否存在,如果不存在,创建这个文件夹。存在的话不创建文件夹。

3ls /tmp/abc > /dev/null 2>&1 || mkdir /tmp/abc && touch /tmp/abc/hehe

命令从左往右执行,检查/tmp/abc文件夹是否存在,不存在的话创建这个文件夹,然后在这个文件夹下创建一个文件。存在的话直接在文件夹下创建一个文件。

假设判断式的固定写法:command1 && command2 || command3

如: ls /etc/sshd || echo "exist" && echo "not exist",如果写反了,例如写成 ls /etc/sshd || echo "exist" && echo "not exist",那么当/etc/sshd目录不存在时,会出现如下输出:


因为 ls /etc/sshd的返回值不为0,所以echo "exist"执行了,因为echo "exist"执行成功了,返回值为0,所以后面的echo "not exist"也执行了。所以判断式要遵从固定写法。

 

3、管道命令(pipe)

管道命令使用的是“|”这个界定符号,仅能处理经由前面一个命令传来的正确信息,也就是standard output的信息,对于standard error并没有直接处理的能力。在每个管道后面接的第一个数据必定是“命令”,而且这个命令必须要能够接收standard input的数据才行,这样的命令才可以是“管道命令”,例如less、more、head、tail等都是可以接收standard input的管道命令。至于例如ls、cp、mv等就不是管道命令了。因为ls、cp、mv并不会接收来自stdin的数据。也就是说,管道命令主要有两个比较需要注意的地方:

1、管道命令仅会处理standard output,对于standard error output会予以忽略。

2、管道命令必须要能够接收来自前一个命令的数据成为standard input继续处理才行。

 

cut:将一行信息的某一段“切”出来

参数:

-d:后面接分隔字符,与-f一起使用;

-f:依据-d的分隔字符将一段信息切为数段,用-f取出第几段的意思;

-c:以字符(characters)的单位取出固定字符区间;

举例:

1)取出/etc/passwd文件中‘:’分隔的第6个内容(也就是用户家目录):

cat /etc/passwd | cut -d ':' -f 6


2)如果要取出第1个(用户名)和第6个,为:cat /etc/passwd | cut -d ':' -f 1,6


3)取出第12个字符以后的字符:cat /etc/passwd | cut -c 12-

4)取出第12个字符到第20个字符:cat /etc/passwd | cut -c 12-20

 

grep:若一行中有需要的信息,就取出该行

grep [-acinv] [--color=auto] ‘查找字符串’ filename

参数:

-a:将binary文件以text文件的方式查找数据;

-c:计算找到‘查找字符串’的次数;

-i:忽略大小写的不同,大小写视为相同;

-n:输出行号;

-v:反向选择,即显示出没有‘查找字符串’的那一行;

-w:单词匹配,grep -w root只匹配含root单词的行而不再匹配含root如roota单词的行;

--color=auto:可以将找到的关键字部分加上颜色显示;


 

wc:计算输出的信息的整体数据

wc [-lwm]

参数:

-l:仅列出行;

-w:仅列出多少字(英文单字);

-m:多少字符;


三个数字分别代表行数、字数、字符数。

 

split:切割命令

split [-bl] file PREFIX

参数:

-b:后面可接欲切割成的文件大小,可加单位,例如b,k,m等;

-l:以行数来进行切割;

PREFIX:代表前导符,可作为切割文件的前导文字。

举例:

1)以100m大小分割/etc/ssh/ideaIC-2019.3.4.tar.gz文件:

split -b 100m /etc/ssh/ideaIC-2019.3.4.tar.gz ideaIC-2019.3.4.tar.gz.


再把这些文件合并:

cat ideaIC-2019.3.4.tar.gz.* >> ideaIC-2019.3.4.tar.gz


在遇到大文件邮件发不出去的时候这个功能就很好用了。

2)以10行为上限分割/etc/ssh/ssh_config文件:

split -l 10 /etc/ssh/ssh_config ssh_config

 

xargs:参数代换

xargs就是用于产生某个命令的参数。xargs可以读入stdin的数据,并且以空格符或断行字符进行分辨,将stdin的数据分隔成为arguments。因为是以空格符作为分隔,所以,如果有一些文件名或者是其他意义的名词内含有空格符的时候,xargs可能就会误判了。

xargs [-0epn] command

参数:

-0:如果输入的stdin含有特殊字符,例如`,\,空格键等特殊字符时,这个参数可以将它还原成一般字符。这个参数可以用于特殊状态。

-e:这个是EOF(end of line)的意思。后面可以接一个字符串,当xargs分析到这个字符串时,就会停止继续工作。

-p:在执行每个命令的参数时,都会询问用户的意思。

-n:后面接次数,每次command命令执行时,要使用几个参数的意思。

当xargs后面没有接任何命令时,默认是以echo来进行输出。

使用xargs的原因是因为很多命令不支持管道命令,需要通过xargs来提供该命令引用standard input之用。

举例:

找出系统中所有ssh_config开头的文件并用ls -al列出它们的详细信息,因为ls -al不是管道命令,所以需要使用xargs:

locate -r 'ssh_config.' | xargs ls -al

 

关于减号-的用途

1)在管道命令中,经常会使用到前一个命令的stdout作为这次的stdin,某些命令需要用到文件名(例如tar)来处理时,该stdin与stdout可以利用减号“-”来替代。

如:tar -cvf - /etc/ssh/tmp | tar -xvf -,这个例子的意思是把/etc/ssh/tmp目录打包,但是打包的数据不是记录到文件,而是传送到stdout。经过管道后,将打包后的结果传送给后面的tar -xvf,后面的-则是取用前一个命令的stdout,因此也就不需要再使用文件了。在这个命令执行过程中打包文件也不会生成。

2)减号-还可以把命令的输出当做stdout传输给管道后面的文件作为参数。

如:ls -al / | split -l 10 - lsroot,这里split -l 10 – lsroot中的减号-代表前面ls -al /的输出,如果需要stdout/stdin但又没有文件时,有的只是-,那么那个-就会被当成stdin或stdout。

 

参考资料

《鸟哥的Linux私房菜基础学习篇(第三版)》

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值