重定向和文件的查找

一、文件描述符定义

文件描述符:是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,依此类推。也可以理解为是一个文件的身份ID。

用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)

 输入输出标准说明

  • STDIN    标准输入  默认的设备是键盘    文件编号为:0
  • STDOUT    标准输出    默认的设备是显示器     文件编号是:1 ,也可以重定向到文件 
  • STDERR    标准错误   默认的设备是显示器   文件编号是:2 ,也可以重定向到文件


查看一个进程打开了哪些文件?

语法 : ls  -l  /proc/进程 ID /fd

[root@python ~]# vim /etc/passwd
[root@python ~]# ps aux | grep passwd
root       2103  0.6  0.2 151372  5048 pts/1    S+   09:03   0:00 vim /etc/passwd
root       2106  0.0  0.0 112676   984 pts/0    S+   09:03   0:00 grep --color=auto passwd
[root@python ~]# ls -l /proc/2103/fd
总用量 0
lrwx------. 1 root root 64 6月  17 09:03 0 -> /dev/pts/1
lrwx------. 1 root root 64 6月  17 09:03 1 -> /dev/pts/1
lrwx------. 1 root root 64 6月  17 09:03 2 -> /dev/pts/1
lrwx------. 1 root root 64 6月  17 09:03 4 -> /etc/.passwd.swp

注:这些 0、1、2、4就是文件的描述符,一个进程启动时,都会打开 3 个文件,标准输入、标准输出、标准错误处理,这三个文件分别对应文件描述符为 0 、 1 和  2 也就是宏替换 STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。

/proc/进程ID/fd    #这个fd目录下,专门存文件描述符

对文件描述符的操作就是对文件本身的操作,也可以直接通过操作文件描述来修改文件 。


查看和临时设置一个进程最多可以打开几个文件,即一个进程可以打开的文件描述符限制。

[root@python ~]# ulimit -n   查看一个进程最多可以同时打开的文件数
1024
[root@python ~]# ulimit -n 2048    修改一个进程最多可以同时打开的文件数为2048
[root@python ~]# ulimit -n
2048

二、重定向的含义-管道的使用-tee命令

定义:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。

重定向输出使用  “ > ”  " >> "   操作符号

语法 :

>   文件名     # 表示将标准输出的内容,写到后面的文件中,如果此文件名已经存在,将会覆盖原文件的内容。

>>  文件名      # 表示将标准输出的内容,追加到后面的文件中,若重定向的输出的文件不存在,则会新建该文件。

 1、查看当前主机的 CPU 的类型保存到 cpu.txt文件中(而不是直接显示到屏幕上)

       [root@python ~]# cat /proc/cpuinfo > cpu.txt


2、将内核的版本信息追加到cpu.txt

       [root@python ~]# uname -a >> cpu.txt

3、清空一个文件

       [root@python ~]# > cpu.txt

输入重定向

1、将命令中接收输入的途径由默认的键盘改为其他文件,而不是等待从键盘输入

[root@python ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@python ~]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

2、mysql 中数据导入

[root@python ~]# mysql -uroot -p123456 < data.sql  
将 data.sql 导入mysql数据库中。

EOF

EOF本意是 End Of File,表明到了文件末尾。”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,可将其理解为分界符(delimiter)。既然是分界符,那么形式自然不是固定的,这里可以将”EOF“可以进行自定义,但是前后的”EOF“必须成对出现且不能和shell命令冲突。

[root@python ~]# cat > a.txt << A 
> a
> b
> c
> d
> A
[root@python ~]# cat a.txt 
a
b
c
d

在脚本中我们可以通过重定向输入来打印消息菜单

在使用的时候需要在 << 右边跟一对终止符,终止符是可以自定义

[root@python ~]# cat a.txt 
#!/bin/bash


cat << eof

====================

1、httpd
2、tomcat 
3、mysql

====================
eof

错误重定向

将命令执行过程中出现的错误信息 (选项或参数错误) 保存到指定的文件,而不是直接显示到显示器

作用:错误信息保存到文件

操作符:  错误重定向符号: 2>    ;  标准输入: 1< 或简写 <  ;  标准输出: 0> 或 >

2  指的是标准错误输出的文件描述符 (在使用标准的输入输出省略了 1 、0 编号)

[root@python ~]# ls /etc/passwd xxx
ls: 无法访问xxx: 没有那个文件或目录
/etc/passwd
[root@python ~]# ls /etc/passwd xxx > a.txt
ls: 无法访问xxx: 没有那个文件或目录
[root@python ~]# cat a.txt 
/etc/passwd
[root@python ~]# ls /etc/passwd xxx 2> a.txt
/etc/passwd
[root@python ~]# cat a.txt 
ls: 无法访问xxx: 没有那个文件或目录

注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符

null 黑洞 和 zero 空文件

1、把/dev/null看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而 /dev/null对命令行和脚本都非常的有用.

[root@python ~]# echo aaa > /dev/null
[root@python ~]# cat /dev/null

2、/dev/zero在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。典型用法是用它来产生一个特定大小的空白文件

例:使用dd命令产生一个50M的文件
if 代表输入文件。如果不指定if,默认就会从stdin中读取输入。

of 代表输出文件。如果不指定of,默认就会将stdout作为默认输出。

bs 代表字节为单位的块大小。

count 代表被复制的块数。

[root@python ~]# dd if=/dev/zero of=test bs=1M count=50
记录了50+0 的读入
记录了50+0 的写出
52428800字节(52 MB)已复制,0.410176 秒,128 MB/秒
[root@python ~]# du -sh test 
50M	test
[root@python ~]# cat test     什么也不显示

正确的写入一个文件,错误的写入一个文件

[root@python ~]# ls /tmp  xxx >ok.txt 2>err.txt

&> 和 >& 符号

& 表示等同于的意思

例1:把正确和错误的消息输入到相同的位置

1>&2  把标准输出重定向到标准错误

2>&1  把标准错误重定向到标准输出,如图:

例2:把正确和错误的消息输入到相同的位置

例3:互动: 工作中shell脚本中的 >/dev/null 2>&1 是什么意思?

[root@xuegod63 ~]# cat /etc/passwd >/dev/null 2>&1

注:标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.


管道 | 的使用

语法:command-a | command-b | command-c | ......

注意:

1、管道命令只处理前一个命令正确输出,不处理错误输出

2、管道右边的命令,必须能够接收标准输入的数据流命令才行

3、管道符可以把两条命令连起来,它可以链接多个命令使用

[root@python ~]# ps aux | grep sshd
root       1116  0.0  0.2 105996  4080 ?        Ss   08:42   0:00 /usr/sbin/sshd -D
root       1767  0.0  0.2 147788  5236 ?        Ss   08:46   0:01 sshd: root@pts/0
root       2036  0.0  0.2 147788  5232 ?        Ss   09:03   0:00 sshd: root@pts/1
root       3316  0.0  0.0 112680   984 pts/0    S+   10:23   0:00 grep --color=auto sshd

tee 命令

功能:读取标准输入的数据,并将其内容输出成文件。
语法:tee [-a][--help][--version][文件...]
参数:

-a, --append          内容追加到给定的文件而非覆盖

       --help  在线帮助

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

例1 :将磁盘使用的信息写入文件

[root@python ~]# df -Thi | tee disk.log


例2:将文件系统使用的信息追加到文件

[root@python ~]# cat /etc/passwd | tee -a disk.log


which-whereis-locate-grep-find查找命令

查找文件一般有以下几个命令:

which    查看可执行文件的位置

whereis  查看可执行文件的位置及相关文件

locate    配合数据库缓存,快速查看文件位置

grep     过滤匹配,它是一个文件搜索工具

find      查找相关文件

[root@python ~]# which cd
/usr/bin/cd
[root@python ~]# whereis cd
cd: /usr/bin/cd /usr/share/man/man1p/cd.1p.gz /usr/share/man/man1/cd.1.gz /usr/share/man/mann/cd.n.gz
[root@python ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz

locate命令和find -name 功能差不多,是它的另外一种写法,但是这个要比find搜索快的多,因为find命令查找的是具体目录文件,而locate它搜索的是一个数据库/var/lib/mlocate/mlocate.db,这个数据库中存有本地所有的文件信息;这个数据库是Linux自动创建并每天自动更新维护。相关的配置信息在/etc/updatedb.conf查看定时任务信息在/etc/cron.daily/mlocate

[root@python ~]# touch /opt/zh.txt
[root@python ~]# locate zh.txt     发现找不到
[root@python ~]# updatedb     如果对当天的文件查找,需要更新数据库 updatedb
[root@python ~]# locate zh.txt
/opt/zh.txt

grep查找使用

作用:过滤,它能够使用正则表达式来搜索文本,并把结果打印出来

-v     取反

-i      忽略大小写

^#    以#开头

#$    以#结尾

^$    空行

-n    对过滤的内容加上行号

|      或者的意思

[root@python ~]# ps -aux | grep sshd | grep -v grep
root       1116  0.0  0.2 105996  4080 ?        Ss   08:42   0:00 /usr/sbin/sshd -D
root       1767  0.0  0.2 147788  5236 ?        Ss   08:46   0:01 sshd: root@pts/0
root       2036  0.0  0.2 147788  5232 ?        Ss   09:03   0:00 sshd: root@pts/1

[root@python ~]# grep bash$ /etc/passwd   以 bash 结尾
root:x:0:0:root:/root:/bin/bash
oracle:x:1000:1000:oracle:/home/oracle:/bin/bash

[root@python ~]# grep "nologin\|root" /etc/passwd | wc -l
39
注 : \ 表示 转义符

[root@python ~]#  egrep "nologin|root" /etc/passwd | wc -l
39

注:egrep 是 grep加强版本

find命令使用(必会,参数比较多)

格式:find    pathname    -options    [-print]

    命令字   路径名称        选项        输出

参数:

pathname:  find命令所查找的目录路径,不输入代表当前目录例如用 . 来表示当前目录,用 / 来表示系统根目录。

find命令选项:

-name     按照文件名查找文件。  “名称”

-perm      按照文件权限来查找文件。666 777 等

-user       按照文件属主来查找文件

-group     按照文件所属的组来查找文件

-mtime  -n  / +n  按照文件的更改时间来查找文件

                - n 表示文件更改时间距现在n天以内

                + n 表示文件更改时间距现在n天以前

-type       查找某一类型的文件

               b - 块设备文件

               d - 目录

               c - 字符设备文件

               p - 管道文件

               - 符号链接文件

               f - 普通文件

-size n  查找符合指定的文件大小的文件

-exec         对匹配的文件执行该参数所给出的其他linux命令, 相应命令的形式为' 命令 {} \;,注意{ }和 \;之间的空格,{}代表查到的内容


按照更改时间或访问时间等查找文件

如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项

        mtime:  文件最后一次修改的时间

        atime:  最后一次访问时间

        ctime:  文件的最后一次变化时间,也就是修改时间

例1:希望在root目录下查找更改时间在1天以内,被修改的文件
[root@python ~]# find / -mtime -1

-exec    这个选项参数后面可以跟自定义的SHELL命令,格式如下:

[root@python ~]# touch {1,2,3}.back
[root@python ~]# find . -name "*.back" -exec ls -l {} \;
-rw-r--r--. 1 root root 0 6月  17 11:05 ./2.back
-rw-r--r--. 1 root root 0 6月  17 11:05 ./3.back
-rw-r--r--. 1 root root 0 6月  17 11:05 ./1.back
[root@python ~]# find . -name "*.back" -exec mv {} /opt \;
[root@python ~]# ls /opt/
1.back  2.back  3.back  rh  zh.txt

xargs 和 find 命令结合 复制文件    -i  表示 find 传递给xargs的结果 由{}来代替

[root@python opt]# find . -name "*.back" | xargs -i mv {} /

比较符的使用:

-a  and 并且

-o  or  或者

超过

-   低于

[root@python ~]# touch a.pdf back.sh
[root@python ~]# find . -name "*.sh" -o -name "*.pdf"
[root@python ~]# find /etc/ -size +20k -a -size -50k | wc -l
33

按权限查找

[root@python ~]# find /bin/ -perm 755    # 等于0755权限的文件或者目录
[root@python ~]# find /bin/ -perm  -644  # -perm -644  至少有644权限的文件或目录

用到的三个特殊符号:   ;   &&   ||

1、 ;分号  不考虑指令的相关性,连续执行, 分号 不保证命令全部执行成功的

&& 逻辑与====》它是只有在前面的命令执行成功后,后面的命令才会去执行

2、 ||   逻辑或===》如果前面的命令执行成功,后面的命令就不去执行了;或者如果前面的执行不成功,才会去执行后面的命令

命令情况

说 明

命令1 && 命令2

如果命令1执行,且执行正确($? = 0),然后执行命令2

如果命令1执行完成,但是执行错误($? ≠0),那么后面的命令是不会执行的

命令1 || 命令2

如果命令1执行,且执行正确($? = 0),那么命令2不执行

如果命令1执行,但执行错误($? ≠ 0),那么命令2执行

运算顺序:LINUX执行命令,是从左到右一个一个执行,从上到下执行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux管道和重定向是两种常用的命令行操作方式。 管道(|)可以将一个命令的输出作为另一个命令的输入,实现两个命令之间的数据传递。例如,使用“ls | grep test”命令可以在当前目录下查找包含“test”关键字的文件重定向(>、>>、<)可以将命令的输出重定向文件中,或者从文件中读取输入。例如,使用“ls > file.txt”命令可以将当前目录下的文件列表输出到名为“file.txt”的文件中。 这两种操作方式可以结合使用,例如使用“ls | grep test > file.txt”命令可以将当前目录下包含“test”关键字的文件列表输出到名为“file.txt”的文件中。 ### 回答2: Linux管道和重定向是Linux操作系统中常用的两种重要的命令行操作技术,它们可以在命令行界面中将不同的命令进行组合和运用,提高命令行操作的效率和灵活性。下面我们将分别介绍管道和重定向的概念、使用方法和特点。 一、Linux管道: 1. 概念: Linux的管道指的是将一个命令的输出结果传递给另一个命令作为输入的方法,通过创建进程间的通信管道来实现。 2. 使用方法: 命令 A | 命令 B 其中,命令 A 会将输出结果传递给命令 B,然后命令 B 再进行处理和输出。例如,将 ls 命令的输出结果传递给 grep 命令进行筛选: ls | grep .txt 3. 特点: 管道可以将多个命令组合在一起,形成一个复杂的命令行操作,提高命令行的效率和灵活性。同时,因为管道是基于进程间的通信,所以会带来一定的系统开销和资源占用。 二、Linux重定向: 1. 概念: Linux的重定向指的是将命令执行的结果输出到指定的文件或者从指定的文件中获取输入数据的方法,通过修改标准输入输出流来实现。 2. 使用方法: 使用符号 ">" 将命令的输出结果重定向文件中: 命令 > 文件名 使用符号 "<" 将文件中的内容作为命令的输入数据: 命令 < 文件名 同时,可以使用符号 ">>" 来将输出结果追加到文件末尾,而不是覆盖原有的内容。 3. 特点: 重定向可以将命令输出到指定的文件或者从指定的文件中获取输入数据,非常方便地实现文件的读取、写入和修改。同时,由于可以在后台运行命令,并将输出结果保存到指定的文件中,因此也可以实现日志记录和脚本自动化等功能。 综上,Linux管道和重定向是非常有用的命令行操作技术,可以帮助用户更加高效地进行命令行操作和管理文件。在实际应用中,可以将它们进行灵活的组合,从而处理各种命令行操作需求,并提高工作效率。 ### 回答3: Linux管道和重定向是Linux系统中非常常用的命令。管道和重定向都是在命令行上使用的符号,它们通过改变命令之间的输入、输出流来实现对数据流的控制。下面我们来详细介绍一下这两种命令的用法及其特点。 一、Linux管道 Unix/Linux管道是将一个命令的输出作为另一个命令的输入。在Linux系统中,管道使用竖线符号“|”来实现。例如,命令"ls -l | grep test" 表示列出当前目录下所有文件的详细信息,并将其中包含test字符的文件信息输出出来。 Linux管道的优点在于它可以将多个命令连接起来,形成一个完整的处理流程。这样可以大大简化命令的编写和输入,并且可以封装成一个可复用的脚本。另外,管道机制可以避免中间变量的处理,大大降低了内存开销。 二、Linux重定向 Unix/Linux系统中,重定向是指改变输入或输出流的方向。在Linux系统中重定向有两种:输入重定向和输出重定向。输入重定向可以将某个命令所需的输入数据重定向为一个文件,而输出重定向可以将命令的输出定向到一个文件或设备中。 输入重定向通常使用“<”符号来实现。如:命令"sort < test.txt" 表示将test.txt文件中的内容作为sort命令的输入。 输出重定向通常使用“>”符号来实现。如:命令"ls > file.txt" 表示将ls命令输出的结果存储到file.txt文件中。 除了“>”符号,我们还可以使用“>>”符号来实现追加输出到指定文件中。例如,命令"echo hello >> file.txt" 将输出“hello”到file.txt文件中,但不会覆盖原有内容。 总结: Linux管道和重定向都是非常有用的命令,它们可以帮助我们控制数据流,并将多个命令串联起来形成一个完整的处理流程。我们需要根据不同的需求合理选择使用管道和重定向,才能更好的利用Linux系统的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值