文件描述符:是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,依此类推。也可以理解为是一个文件的身份ID
STDIN 标准输入 默认的设备是键盘 文件编号为:0
STDOUT 标准输出 默认的设备是显示器 文件编号为:1 ,也可以重定向到文件
STDERR 标准错误 默认的设备是显示器 文件编号为:2 ,也可以重定向到文件
eg:查看一个进程打开的哪些文件
从第三个终端上,可以看出打开一个/etc/passwd使用了4个文件。可以查看一个进程打开文件的个数。/proc目录下存在着许多的进程。fd是专门存放文件描述符的目录
终端一:
[root@break ~]# vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
终端二:
[root@break ~]# ps -aux | grep passwd
root 6137 0.0 0.2 151640 5344 pts/4 S+ 22:18 0:00 vim /etc/passwd
终端三:
[root@break ~]# ls /proc/6137/fd
0 1 2 4
[root@break ~]# cd /proc/6137/fd
[root@break fd]# ll
总用量 0
lrwx------. 1 root root 64 3月 27 22:19 0 -> /dev/pts/4
lrwx------. 1 root root 64 3月 27 22:19 1 -> /dev/pts/4
lrwx------. 1 root root 64 3月 27 22:18 2 -> /dev/pts/4
lrwx------. 1 root root 64 3月 27 22:19 4 -> /etc/.passwd.swp
#一个进程打开的文件个数是有限的,那么该如何查看呢?
ulimit -n :查看进程最多打开的文件
ulimit -n +数字:设置进程打开文件的最大个数
[root@break ~]# ulimit -n
1024
[root@break ~]# ulimit -n 2048
[root@break ~]# ulimit -n
2048
文件的重定向
>:表示输出到指定的文件。若文件存在,则覆盖
>>:追加
#将cpu信息保存到一个文件中
[root@break ~]# cat /proc/cpuinfo > cpu.txt
[root@break ~]# cat cpu.txt
processor : 0
vendor_id : GenuineIntel
#将内核信息追加到cpu.txt
[root@break ~]# uname -a
Linux break.cn 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@break ~]# uname -a >> cpu.txt
[root@break ~]# tail -1 cpu.txt
Linux break.cn 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
#清空一个文件
[root@break ~]# cat cpu.txt
#输入重定向
[root@break ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@break ~]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
系统默认为我们备份了/etc/passwd-和/etc/shadow-文件。
vimdiff /etc/passwd /etc/passwd-
EOF本意是 End Of File,表明到了文件末尾。”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,可将其理解为分界符(delimiter)。既然是分界符,那么形式自然不是固定的,这里可以将”EOF“可以进行自定义,但是前后的”EOF“必须成对出现且不能和shell命令冲突。
#表示将eof后面的内容,保存进入a.txt
[root@break ~]# cat > a.txt <<eof
> 1
> 2
> 3
> eof
[root@break ~]# cat a.txt
1
2
3
[root@break ~]# cat > a.txt <<cc
> 4
> 5
> cc
[root@break ~]# cat a.txt
4
5
eof经常用在shell脚本中
[root@break ~]# sh a.sh
asdf
asdf
dfsa
fdas
sdfa
012
2>:错误重定向符号
1<:<标准输入
0>:>标准输出
#将错误信息重定向
[root@break ~]# ls /etc/passwd asfdasdfasdfas 2> b.txt
/etc/passwd
[root@break ~]# cat b.txt
ls: 无法访问asfdasdfasdfas: 没有那个文件或目录
null和zero空文件。
/dev/null是一个黑洞文件,/dev/zero可以看作一个空白的文件,可以产生固定大小的文件
dd用来创建一个文件,if表示输入,of表示输出,bs表示每一块的大小,count表示块的数量。
[root@break test]# dd if=/dev/zero of=b.txt bs=34M count=23
记录了23+0 的读入
记录了23+0 的写出
819986432字节(820 MB)已复制,21.7099 秒,37.8 MB/秒
#将错误信息和正确信息都放到1.txt中,&理解为等同于的意思
[root@break test]# ll /etc/ asdff >1.txt 2>&1
[root@break test]# ll /etc/ asdff 2>1.txt 1>&2
解释以下内容:将正确信息和错误信息都放到黑洞中
[root@break test]# cat /etc/passwd >/dev/null 2>&1
tee管道命令,读取标准输入的数据,并将其内容输出成文件。
tee:a参数表示追加到某个文件中。
#将磁盘信息写入1.file
[root@break test]# df -h | tee 4.txt
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 10G 4.7G 5.4G 47% /
devtmpfs 975M 0 975M 0% /dev
tmpfs 992M 0 992M 0% /dev/shm
tmpfs 992M 11M 981M 2% /run
tmpfs 992M 0 992M 0% /sys/fs/cgroup
/dev/sr0 4.2G 4.2G 0 100% /mnt
/dev/sda1 197M 135M 62M 69% /boot
tmpfs 199M 32K 199M 1% /run/user/1000
tmpfs 199M 0 199M 0% /run/user/0
[root@break test]# cat 4.txt
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 10G 4.7G 5.4G 47% /
devtmpfs 975M 0 975M 0% /dev
tmpfs 992M 0 992M 0% /dev/shm
tmpfs 992M 11M 981M 2% /run
tmpfs 992M 0 992M 0% /sys/fs/cgroup
/dev/sr0 4.2G 4.2G 0 100% /mnt
/dev/sda1 197M 135M 62M 69% /boot
tmpfs 199M 32K 199M 1% /run/user/1000
tmpfs 199M 0 199M 0% /run/user/0
[root@break test]# df -h | tee 1.file
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 10G 4.7G 5.4G 47% /
devtmpfs 975M 0 975M 0% /dev
tmpfs 992M 0 992M 0% /dev/shm
tmpfs 992M 11M 981M 2% /run
tmpfs 992M 0 992M 0% /sys/fs/cgroup
/dev/sr0 4.2G 4.2G 0 100% /mnt
/dev/sda1 197M 135M 62M 69% /boot
tmpfs 199M 32K 199M 1% /run/user/1000
tmpfs 199M 0 199M 0% /run/user/0
#将磁盘信息追加写入一个日志文件中。
[root@break test]# df -h | tee -a 1.file
查找命令的使用
which:查看可执行文件的信息
whereis:查看可执行文件的位置及相关文件
locate:配合数据库,来快速查找文件位置
grep: 过滤匹配
find:查找相关文件
locate:这个命令和find -name差不多,但是他会更加快速,因为find查找的是具体的目录文件,
locate:查找的是数据库/var/lib/mlocate,配置文件为/etc/updatedb.conf。查看定时任务的信息在/etc/cron.daily/mlocate中。
命令的例子:
[root@break test]# which cd
/usr/bin/cd
[root@break test]# whereis cd
cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
#使用locate时候,他会找自己的数据库中找内容,如果对于一个新的文件,还没有来的及mlocate.db保存,则找不到,这个时候就需要使用updatedb来强制更新数据库mlocate.db
[root@break test]# locate 2.back
/root/test/2.back
[root@break test]# touch 12.txt
[root@break test]# locate 12.txt
/usr/share/doc/git-1.8.3.1/RelNotes/1.7.12.txt
/usr/share/vim/vim74/doc/usr_12.txt.gz
[root@break test]# updatedb
[root@break test]# locate 12.txt
/root/test/12.txt
/usr/share/doc/git-1.8.3.1/RelNotes/1.7.12.txt
/usr/share/vim/vim74/doc/usr_12.txt.gz
作用:过滤,它能够使用正则表达式来搜索文本,并把结果打印出来
参数:
| 或者的意思
-v 取反
-i 忽略大小写
^# 以#开头
#$ 以#结尾
^$ 空行
-n 对过滤的内容加上行号
[root@break test]# cat /etc/passwd | grep -n root
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin