linux管道符写入文件,Linux学习Day4:管道符、重定向与环境变量

c4468b3f4df77e96b0a416fa2a870fba.png

Linux学习Day4:管道符、重定向与环境变量

仅仅是学习Linux系统的命令还不够,只有把多个命令按照自己想要的方式进行组合使用,才能提高工作效率。今天的内容主要是关于如何把命令组合在一起使用,使得输入的命令更准确、更高效,也为接下来的Shell脚本打好基础。

一、输入输出重定向

输入重定向:指把文件内容导入到命令中。

输出重定向:指把原本要输出到屏幕的数据信息写入到指定的文件中,又分为标准输出重定向和错误输出重定向两种。

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或命令输入。

标准输出重定向(STDIN,文件描述符为1):默认输出到屏幕。

错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。

要区别对待两种输出信息,第一种是命令的标准输出信息,第二种是命令的报错提示信息(错误输出),如下所示:

[root@linuxprobe ~]# ls -l anaconda-ks.cfg-rw-------. 1 root root 1032 Feb 18 2019 anaconda-ks.cfg //ls命令的标准输出信息,也是我们想要的信息

[root@linuxprobe~]#

[root@linuxprobe~]# ls -l xxxxx

ls: cannot access xxxxx: No such file or directory //因为xxxxx文件不存在,所以输出的是报错提示信息

[root@linuxprobe~]#

对于输入重定向来说,用到的符号及其作用如下所示:

符号

作用

命令 < 文件

将文件作为命令的标准输入

命令 << 分界符

从标准输入中读入,直到遇见分界符才停止(分界符可以自己定义,如"EOF"、"over"等)

命令 < 文件1 > 文件2

将文件1作为命令的标准输入并将标准输出到文件2

对于输出重定向来说,用到的符号及其作用如下所示:

符号

作用

命令 > 文件

将标准输出重定向到一个文件中(清空原有文件的数据)

命令 2> 文件

将错误输出重定向到一个文件中(清空原来文件的数据)

命令 >> 文件

将标准输出重定向到一个文件中(追加到原有文件的后面)

命令 2>> 文件

将错误输出重定向到一个文件中(追加到原有内容的后面)

命令 >>  文件 2>&1  或  命令 &>> 文件

将标准输出和错误输出共同写入到文件中(追加到原有内容的后面)

通过标准输出重定向将 man ls 命令原本要输出到屏幕的信息写入文件readme.txt中,然后显示readme.txt文件中的内容,具体命令如下:

[root@linuxprobe ~]# man ls >readme.txt

[root@linuxprobe~]#

[root@linuxprobe~]# cat readme.txt

LS(1) User Commands LS(1)

NAME

ls-list directory contents

SYNOPSIS

ls [OPTION]... [FILE]...

DESCRIPTION

List information about the FILEs (the current directory bydefault). Sort entries alphabetically if none of -cftuvSUX nor--sort isspecified.---------------------------------省略部分输出内容---------------------

通过覆盖写入模式向readme.txt文件中写入一行数据,然后再通过追加写入模式再写入一行数据,具体命令如下:

[root@linuxprobe ~]# echo "Welcome to my home" >readme.txt //清除原有的内容

[root@linuxprobe~]# echo "Learning Linux is happy to me" >>readme.txt //追加至原来文件内容的后面

[root@linuxprobe~]#

[root@linuxprobe~]# cat readme.txt

Welcome to my home

Learning Linuxishappy to me

[root@linuxprobe~]#

如果想把命令的报错信息写入文件,该如何操作呢?

[root@linuxprobe ~]# ls -l xxxxx

ls: cannot access xxxxx: No such file or directory //提示xxxxx文件不存在

[root@linuxprobe~]#

[root@linuxprobe~]# ls -l xxxxx 2>readme.txt //将报错信息写入readme.txt文件

[root@linuxprobe~]#

[root@linuxprobe~]# cat readme.txt

ls: cannot access xxxxx: No such file or directory //报错信息写入readme.txt文件成功

[root@linuxprobe~]#

输入重定向相对来说比较冷门,在工作中遇到的概率较小。输入重定向的作用是把文件内容直接导入命令中。接下来使用输入重定向把readme.txt文件导入给wc -l命令,统计文件内容的行数。

[root@linuxprobe ~]# cat readme.txt

ls: cannot access xxxxx: No such file or directory

[root@linuxprobe~]#

[root@linuxprobe~]# wc -l

二、管道命令符

管道符,即“|”,其执行的格式“命令A | 命令B”,当然可以这样使用:“命令A | 命令B | 命令C”。管道命令符的作用是把前一个命令A原本要输出到屏幕的标准正常数据当作是后一个命令B的标准输入,比如把搜索命令的输出值传递给统计命令,具体如下:

[root@localhost ~]#grep "/sbin/nologin" /etc/passwd | wc -l19[root@localhost~]#

再比如用翻页的形式查看/etc目录中的文件列表及属性信息:

[root@localhost ~]# ls -l /etc/ |more

total1168

-rw-r--r--. 1 root root 16 Jun 18 2019adjtime-rw-r--r--. 1 root root 1518 Jun 7 2013aliases-rw-r--r--. 1 root root 12288 Jun 18 2019aliases.db

drwxr-xr-x. 2 root root 236 Jun 18 2019alternatives-rw-------. 1 root root 541 Mar 31 2016anacrontab-rw-r--r--. 1 root root 55 Nov 4 2016asound.conf-rw-r--r--. 1 root root 1 Oct 30 2018at.deny

drwxr-x---. 3 root root 43 Jun 18 2019audisp

drwxr-x---. 3 root root 83 Jun 18 2019audit

drwxr-xr-x. 2 root root 22 Jun 18 2019bash_completion.d-rw-r--r--. 1 root root 2853 Nov 5 2016bashrc

drwxr-xr-x. 2 root root 6 Nov 6 2016binfmt.d-rw-r--r--. 1 root root 38 Nov 29 2016 centos-release--More--

在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过管道符和passwd命令的--stdin参数相结合,可以用一条命令来完成密码重置的操作:

[root@localhost ~]# echo "123456" | passwd --stdin root //一条命令修改root用户密码

Changing passwordforuser root.

passwd: all authentication tokens updated successfully.

[root@localhost~]#

通过重定向技术能够一次性地把多行信息打包输入或输出,比如让用户一直输入内容,直到用户输入了其自定义的分界符时,才结束输入。这种方法在编写自动化脚本时经常用到。

[root@localhost ~]# mail -s "readme" root@localhost <

> i think linuxisvery practical

> i hope to learn more

> can you teach me?> over //遇到分界符后结束输入,以上3行信息则为用户输入的有效内容

[root@localhost~]#

三、命令行的通配符

通配符,顾名思义,就是通用的匹配信息的符号,常见的通配符如下所示:

星号(*)代表匹配零个或多个字符;

问号(?)代表匹配单个字符;

中括号内加上数字([0-9])代表匹配0~9之间的单个数字的字符;

中括号内加上字母([abc])则代表匹配a、b、c三个字中的任意一个字符。

匹配在/dev目录中所有以sda开头的文件:

[root@localhost ~]# ls -l /dev/sda*brw-rw----. 1 root disk 8, 0 Feb 20 23:57 /dev/sda

brw-rw----. 1 root disk 8, 1 Feb 20 23:57 /dev/sda1

brw-rw----. 1 root disk 8, 2 Feb 20 23:57 /dev/sda2

[root@localhost~]#

匹配以sda开头,且后面还紧跟某一个字符(字符包括字母、数字、特殊符号等等)的文件:

[root@localhost ~]# ls -l /dev/sda? //该命令排除了/dev/sda文件

-rw-r--r--. 1 root root 0 Feb 21 02:39 /dev/sda@ //该文件为本人所创建,用来实验测试

brw-rw----. 1 root disk 8, 1 Feb 20 23:57 /dev/sda1

brw-rw----. 1 root disk 8, 2 Feb 20 23:57 /dev/sda2

[root@localhost~]#

匹配以sda开头,且后面还紧跟某一个数字的文件:

[root@localhost ~]# ls -l /dev/sda[0-9]

brw-rw----. 1 root disk 8, 1 Feb 20 23:57 /dev/sda1

brw-rw----. 1 root disk 8, 2 Feb 20 23:57 /dev/sda2

[root@localhost~]#

匹配以sda开头,且后面还紧跟1、3、5中的某一个数字的文件:

[root@localhost ~]# ls -l /dev/sda[135]

brw-rw----. 1 root disk 8, 1 Feb 20 23:57 /dev/sda1

[root@localhost~]#

四、常用的转义字符

Shell解释器提供了丰富的转义字符来处理输入的特殊数据,常见的4个转义字符如下所示:

反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串;

单引号(''):转义其中所有的变量为单纯的字符串;

双引号(""):保留其中的变量属性,不进行转义处理;

反引号(``):把其中的命令执行后返回结果。

实验:先定义一个名为PRICE的变量并赋值5,然后输出以双引号括起来的字符串与变量信息:

[root@localhost ~]# PRICE=5[root@localhost~]#

[root@localhost~]# echo "Price is $PRICE" //保留其中变量属性Priceis 5

实验:想要输出“Price is $5”,需要使用反斜杠进行转义。

[root@localhost ~]# echo "Price is $$PRICE" //$$的作用是显示当前程序的进程ID号码Priceis2571PRICE

[root@localhost~]#

[root@localhost~]# echo "Price is \$$PRICE" //使用反斜杠进行转义Priceis $5[root@localhost~]#

实验:输出命令执行的结果。

[root@localhost ~]# echo `uname -a` //先执行uname -a命令,然后输出执行结果

Linux localhost.localdomain3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[root@localhost~]#

五、重要的环境变量

变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都用大写表示,这是一种约定俗成的规范。可以直接通过变量名称来提取对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户的家目录、邮件存放的位置等。

在执行了一条命令后,Linux系统中到底发生了什么呢?简单来说,主要分为4个步骤:

第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls就是以绝对路径的方式执行命令),如果是的话则直接执行。

3905c1683fb0db4800ece1bfd7752bd5.png

第2步:Linux系统检查用户输入的命令是否为“别名命名”,即用一个自定义的命令名称来替换原本的命令名称。alias命令可以用来创建属于自己的命令别名,格式为“alias 别名=命令”。unalias命令用来取消命令别名,格式为“unalias 别名”。在上图中,输入ls命令后,不同的文件类型显示不同的颜色,这其实就是Linux系统为了方便用户区分文件类型而特意设置的ls命令别名。

2d81cedc216922e3907c785b5ff5c037.png

[root@localhost ~]# alias ls='ls --color=auto' //设置命令的别名,执行ls命令则等同于执行ls --cloar=auto[root@localhost~]#

原文链接:https://www.cnblogs.com/xuliang-daydayup/p/12337711.html

如有疑问请与原作者联系

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值