重定向

C语言程序一般会打开三个缺省文件,stdin、stdout、stderr,文件描述符分别是0,1,2。

在Unix系统中,文件是io的基本抽象。标准输入、标准输出、错误输出可以替换为其它文件。

标准输出重定向

  • command > file
  • command >> file 追加

标准输入重定向

  • command < file
  • command << EOF 标准输入,当碰到EOF字符串时,输入结束

标准错误输出重定向

  • command 2> file 将command的错误输出重定向到file文件

  • command 2>> file 追加重定向

重定向标准输出+标准错误输出

command &> file

command &>> file 追加重定向

特别文件

/dev/null bit垃圾桶

command > /dev/null

Cat命令与重定向

cat > myfirst

cat >> myfirst

cat myfirst > mysecond

cat myfirst mysecond > mythird

cat > myfirst << EOF

管道

pipeline

shell将一个程序的标准输出作为另一个程序的标准输入,形成管道(pipeline)

  • command A | command B
  • 注意两条命令之间是以一个匿名文件传输
  • ls –al | grep -e “^d”
  • ls -al | less

Shell如何实现管道?

•pipe()函数创建一个两个文件描述符,一个输入,一个输出

•fork

•主要的问题是:如何将父进程的标准输出替换为pipe输出,子进程的标准输入替换为pipe输入

参考:http://www.rozmichelle.com/pipes-forks-dups/

文件操作

cp拷贝源文件成目标文件

  • -b 如果目标文件存在备份~
  • -i 如果目标文件存在,提示
  • -r 递归拷贝

mv移动文件

  • -b 如果目标文件存在,则备份~
  • -i 如果目标文件存在,提示
  • -f 强制移动

wc统计字数

短选项 长选项 功能
-l –lines 统计行数
-w –words 统计单词数量
-c –chars 统计字符数量
–help 帮助

head显示文件头部

缺省显示头部10行

短选项 长选项 功能
-n –lines=n 显示头部n行
-c n –chars=n 显示头部n个字符
–help 帮助
–version 版本号

tail显示文件尾部

缺省是尾部10行

短选项 长选项 功能
-n –lines=n 显示尾部n行
-c n –chars=n 显示尾部n个字符
–help 帮助
–version 版本号

cut命令纵向输出文件的某个列

短选项 长选项 功能
-f LIST –fields=LIST 指定剪切的域
-d x –delimiter=x 指定域的分隔符
-c LIST –characters=LIST 指定剪切字符位置
–help 帮助

LIST为如下形式:

  • n-m 表示[n,m]的域
  • n,m 表示n和m域

缺省分隔符是TAB制表键

paste命令横向连接两个文件

短选项 长选项 功能
-d x –delimiters=x 指定域分隔符
–help 帮助

•缺省分隔符为TAB制表符

more命令分页显示文件内容

可以向后翻,但不能向前翻。less命令是more的改进,可以向前翻

sort命令排序按照行做字典序排列文件内容

选项 功能
-b 忽略行首的空格
-d 在字典序比较中,忽略标点符号和控制符号
-t 指定域分隔符
-n 数字以数值排序
-r 逆序排列
-o 指定输出文件

按照字典序,大写字母比小写字母更靠前

sort /etc/passwd

按照uid排列所有用户

sort -t : -n +2 /etc/passwd

grep命令搜索字符串

打开文件,在文件中以RE方式搜索字符串:grep [OPTION…] PATTERNS [FILE…]

短选项 长选项 功能
-c –count 只显示匹配的行数
-i –ignore-case 忽略大小写匹配
-G –basic-regexp BRE,grep缺省
-E –extended-regexp ERE,egrep缺省
-e PATTERNS –regexp=PATTERNS 指定一个或多个RE
-v –invert-match 显示不匹配的行
-n –line-number 输出行号

xargs

•xargs [command [initial-arguments]]

•xargs从标准输入上读,将标准输入文件按照空格/TAB拆解成参数,作为command执行参数。

查找epoll_wait函数在那个文件:find /usr/include –name “*.h” -type f | xargs grep “epoll_wait”

文件系统原理

Unix三大抽象

  • 进程、线程对执行过程
  • 文件对io
  • 地址空间对内存

Unix四种io

文件系统、块设备、字符设备、socket

  • 块设备和字符设备出现在文件系统的名字空间
  • Socket仅表现为文件

Unix文件系统

堆+索引

•索引 key→value,key是文件名,要求变长,

•inode叫做索引节点号,这是Linux文件系统管理文件的方式。在建立文件系统时,会建立一个索引节点表,里面包含一定数量的索引节点。每当建立一个文件时,就会为他分配一个索引节点号,相当于文件的地址。

典型Unix磁盘布局

目录文件→i-node → data;ls –i显示节点

inode

链接文件

ln [OPTION]… [-T] TARGET LINK_NAME

  • ln命令不会创建新的i-node,而是引用已有i-node,增加引用计数,与普通文件没什么不同
  • ln –s符号链接,分配一个新的inode,内部记录指向原有文件,类似于Windows的快捷方式

软连接(符号链接)与硬连接的应用场景:

  • 硬链接:防止因为误操作而错误删除文件
  • 符号链接:方便管理;解决文件系统磁盘空间不足的情况