Linux必学60个命令之文件处理
2009-06-08 20:55:39 Administrator

Linux系统信息存放在文件里,文件与普通的公务文件类似。每个文件都有自己的名字、内容、存放地址及其它一些管理信息,如文件的用户、文件的大小等。文件可以是一封信件、一个通讯录,或者是程序的源语句、程序的数据,甚至可以包括可执行的程序和其它非正文内容。 Linux文件系统具有良好的结构,系统提供了很多文件处理程序。这里主要介绍常用的文件处理命令。文章正式开始前,先盘点一些最为常见的6个shell操作指令:

1.文本处理-echo
echo -e "\033[40;35m...."
背景颜色范围:40--49
40:黑  41:深红  42:绿  43:黄色  44:蓝色  45:紫色  46:深绿  47:百色

字体颜色范围:30-39
30:黑  31:红  32:绿  33:黄  34:蓝色   35:紫色  36:深绿   37:百色

eg:echo -e "\033[40;35mhello word\033[0m"

2.文本处理-sort
sort [选项] 输入文件
-o 输出文件
-d 按字典顺序排序
-n 按数字大小输出
-r 按逆序输出排序结果
-k 指定分类是域上得数子分类
-t 域分隔符;用非空格或tab键分隔域

eg:sort -k3 -n -r -t: /etc/passwd|more

3.文本处理-diff
diff[选项] 文件/目录 文件/目录
diff /etc/passwd /etc/passwd.bak
-q 仅显示有无差异,不显示详细的信息
-c 显示全部内文,并标出不同之处
-b 不检查空格字符的不同
-B 不检查空白行
-r 比较子目录中的文件

4.grep 选项
-n 在每行前显示编号
应用实例
a.设置大小写
#grep '[Tt]his' file1.txt

b.不匹配行首
#grep '^[^#]' file.txt //找出不是以#开头的字符字符串

c.匹配任意字符
#grep "s...n" file3.txt
s123n true
s34n false

注意:三个点三个字符

d.-v
grep -v "hello" file
搜索不含有"hello" 字符串的行

5.sed操作
s  替代操作
i  插入命令
a  附加命令
d  删除全部匹配的行
D  删除全部匹配的行

示例:
#sed -n '1,4 p' /etc/passwd 打印/etc/passwd的1到4行
#sed '/80/D' file.txt 删除全部匹配80的行
#sed 's/var/usr/g' file.txt 所有var用usr替换
#sed '50,$s/help/man/g' file.txt所有help用man替换
#sed "3i\\chengyaogen" log   log文件的第三行前面插入chengyaogen
#sed "3a\\chengyaogen" log   log文件的第三行后面插入chengyaogen
#sed "3d"  log  删除log文件的第三行

6.awk格式
awk [选项] 'awk脚本' 输入文件
-F fs使用fs作为输入记录的字段分隔符
-f filename 从文件filename读取awk_script
-v var=value 为awk_script设置变量

awk的内置变量
变量        功能             默认
FS       输入字段分隔符     空格或tab
RS       输入记录分隔符     换行
OFS      输出字段分隔符     空格或tab
ORS      输出记录分隔符     换行
NF       当前记录非空字段的编号 $NF 最后一列
NR       从所有文件读入的记录号 $NR 对应的行号

应用实例
#awk -F : '{print NR,1,1,1,2}' /etc/passwd
输出/etc/passwd的第一列、第二列并显示对应的行号

#awk -F : '{print NR,1,1,1,NF}' /etc/passwd
输出/etc/passwd的第一列,最后一列并显示对应的行号

#awk -F : 'NR%10==5{print NR,$0}' /etc/passwd
输出行号对10 求余为5的一整行信息

#awk -F : 'NR==8,NR==13{print NR,$0}' /etc/passwd
输出行号[8,13]的行的信息

#awk -F : '{if($3>50){print $1}}' /etc/passwd


file
1.作用
file通过探测文件内容判断文件类型,使用权限是所有用户。
2.格式
file [options] 文件名
3.[options]主要参数
-v:在标准输出后显示版本信息,并且退出。
-z:探测压缩过的文件类型。
-L:允许符合连接。
-f name:从文件namefile中读取要分析的文件名列表。
4.简单说明
使用file命令可以知道某个文件究竟是二进制(ELF格式)的可执行文件, 还是Shell Script文件,或者是其它的什么格式。file能识别的文件类型有目录、Shell脚本、英文文本、二进制可执行文件、C语言源文件、文本文件、DOS的可执行文件。
5.应用实例
如果我们看到一个没有后缀的文件grap,可以使用下面命令:
$ file grap
grap: English text
此时系统显示这是一个英文文本文件。需要说明的是,file命令不能探测包括图形、音频、视频等多媒体文件类型。

mkdir
1.作用
mkdir命令的作用是建立名称为dirname的子目录,与MS DOS下的md命令类似,它的使用权限是所有用户。
2.格式
mkdir [options] 目录名
3.[options]主要参数
-m, --mode=模式:设定权限,与chmod类似。
-p, --parents:需要时创建上层目录;如果目录早已存在,则不当作错误。
-v, --verbose:每次创建新目录都显示信息。
--version:显示版本信息后离开。
4.应用实例
在进行目录创建时可以设置目录的权限,此时使用的参数是“-m”。假设要创建的目录名是“tsk”,让所有用户都有rwx(即读、写、执行的权限),那么可以使用以下命令:
$ mkdir -m 777 tsk

grep
1.作用
grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2.格式
grep [options]
3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\:忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$:匹配正则表达式的结束行。
\<:从匹配正则表达式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
.:所有的单个字符。
* :有字符,长度可以为0。
正则表达式是Linux/Unix系统中非常重要的概念。正则表达式(也称为“regex”或“regexp”)是一个可以描述一类字符串的模式(Pattern)。如果一个字符串可以用某个正则表达式来描述,我们就说这个字符和该正则表达式匹配(Match)。这和DOS中用户可以使用通配符“*”代表任意字符类似。在Linux系统上,正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作和其它功能。
4.应用实例
查询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量IP地址。有时IP地址会超过2000个。如果要查看nnn.nnn网络地址,但是却忘了第二部分中的其余部分,只知到有两个句点,例如nnn nn..。要抽取其中所有nnn.nnn IP地址,使用[0-9 ]\{3 \}\.[0-0\{3\}\。含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。
$grep '[0-9 ]\{3 \}\.[0-0\{3\}\' ipfile 

补充说明,grep家族还包括fgrep和egrep。fgrep是fix grep,允许查找字符串而不是一个模式;egrep是扩展grep,支持基本及扩展的正则表达式,但不支持\q模式范围的应用及与之相对应的一些更加规范的模式。

dd
1.作用
dd命令用来复制文件,并根据参数将数据转换和格式化。
2.格式
dd [options]
3.[opitions]主要参数
bs=字节:强迫 ibs=及obs=。
cbs=字节:每次转换指定的。
conv=关键字:根据以逗号分隔的关键字表示的方式来转换文件。
count=块数目:只复制指定的输入数据。
ibs=字节:每次读取指定的。
if=文件:读取内容,而非标准输入的数据。
obs=字节:每次写入指定的。
of=文件:将数据写入,而不在标准输出显示。
seek=块数目:先略过以obs为单位的指定的输出数据。
skip=块数目:先略过以ibs为单位的指定的输入数据。
4.应用实例
dd命令常常用来制作Linux启动盘。先找一个可引导内核,令它的根设备指向正确的根分区,然后使用dd命令将其写入软盘:
$ rdev vmlinuz /dev/hda
$dd if=vmlinuz of=/dev/fd0
上面代码说明,使用rdev命令将可引导内核vmlinuz中的根设备指向/dev/hda,请把“hda”换成自己的根分区,接下来用dd命令将该内核写入软盘。

find
1.作用
find命令的作用是在目录中搜索文件,它的使用权限是所有用户。
2.格式
find [path][options][expression]
path指定目录路径,系统从这里开始沿着目录树向下查找文件。它是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。
3.主要参数
[options]参数:
-depth:使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容。
-maxdepth levels:表示至多查找到开始目录的第level层子目录。level是一个非负数,如果level是0的话表示仅在当前目录中查找。
-mindepth levels:表示至少查找到开始目录的第level层子目录。
-mount:不在其它文件系统(如Msdos、Vfat等)的目录和文件中查找。
-version:打印版本。
[expression]是匹配表达式,是find命令接受的表达式,find命令的所有操作都是针对表达式的。它的参数非常多,这里只介绍一些常用的参数。
-name:支持统配符*和?。
-atime n:搜索在过去n天读取过的文件。
-ctime n:搜索在过去n天修改过的文件。
-group grpoupname:搜索所有组为grpoupname的文件。
-user 用户名:搜索所有文件属主为用户名(ID或名称)的文件。
-size n:搜索文件大小是n个block的文件。
-print:输出搜索结果,并且打印。

-type c
File is of type c(要查找文件的类型):

b    block (buffered) special
c    character (unbuffered) special
d    directory
p    named pipe (FIFO)
f    regular file
l    symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken.  If you want  to search for symbolic links when -L is in effect, use -xtype.
s    socket
D    door (Solaris)

To search for more than one type at once, you can supply the combined list of type letters separated by a comma ',' (GNU extension).

如果想对多个文件扩展名进行处理的话,在find的-name里面还没有相应的解决方法,用()或','分隔开都不能达到预期,不过类型是可以这样写的。文件3个相关时间的处理,可以细读此文:关于inode。这里主要说一下时间的单位(以atime与amin这个访问的时间参数为例,解释来源于其man手册),可依据时间类型来做相关的处理。

-atime n
File was last accessed n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.

-amin n
File was last accessed n minutes ago.

可以看见两者的单位区别在于天与分钟。

4.应用技巧
find命令查找文件的几种方法:
(1)根据文件名查找
例如,我们想要查找一个文件名是lilo.conf的文件,可以使用如下命令:
find / -name lilo.conf
find命令后的“/”表示搜索整个硬盘。
(2)快速查找文件
根据文件名查找文件会遇到一个实际问题,就是要花费相当长的一段时间,特别是大型Linux文件系统和大容量硬盘文件放在很深的子目录中时。如果我们知道了这个文件存放在某个目录中,那么只要在这个目录中往下寻找就能节省很多时间。比如smb.conf文件,从它的文件后缀“.conf”可以判断这是一个配置文件,那么它应该在/etc目录内,此时可以使用下面命令: find /etc -name smb.conf
这样,使用“快速查找文件”方式可以缩短时间。
(3)根据部分文件名查找方法
有时我们知道只某个文件包含有abvd这4个字,那么要查找系统中所有包含有这4个字符的文件可以输入下面命令: find / -name '*abvd*'
输入这个命令以后,Linux系统会将在/目录中查找所有的包含有abvd这4个字符的文件(其中*是通配符),比如abvdrmyz等符合条件的文件都能显示出来。
(4)使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如:我们想在/etc目录中查找大于500000字节,并且在24小时内修改的某个文件,则可以使用-and (与)把两个查找参数链接起来组合成一个混合的查找方式。
find /etc -size +500000c -and -mtime +1

find . -name  txt //在当前目录查找名字为txt的文件或者是文体夹
find . -type c //字符设备
find . -type d //目录
find /dev -type b //块设备
find /dev -type s //网络设备
find /dev -type l //链接设备
find /dev -type p //管道设备
find . -size 141c //打到字节数为141的文件
find . -size +100c  -size -5000c   //找到字节数大于100且小于5000的文件或者文件夹
find . -empty //打到空文件
find . -perm  644 //找到权限为644
find . -gid 0 //组id为0
find . -uid 0 //用户id为0
find . -empty -exec rm -rf {} \; //找到空文件并且删掉
find . -empty -exec cp {} /root/Desktop/  -r  \; //找到空文件并且复制到桌面
find /tmp -type f -name "*.tmp" -atime +3 -exec ls -lht {} \;    //找出/tmp目录下,过去3天没有被访问过的,后缀为.tmp的普通文件

Linux下删除大小为零的文件(Linux delete file with size zero)(注意:删除一定要谨慎,建议使用mv来代替,给自己设定一个冷静期)

列出并删除指定目录下所有大小为0的文件(递归遍历目录)
find /tmp -size 0 -print -delete

处理指定的文件
if [ ! -s /tmp/foo ] ; then
  rm -fv /tmp/foo
fi

To search and delete empty files in the current directory and subdirectories:
find . -type f -size 0b -ls
find . -type f -size 0b -print
find . -type f -size 0 -print0
find . -type f -empty -delete
find . -type f -size 0 -delete
find . -type f -size 0b -delete
find . -type f -empty -exec rm -fv {} \;

-type f is necessary because also directories are marked to be of size zero.

The dot . (current directory) is the starting search directory. If you have GNU find (e.g. not Mac OS), you can omit it in this case:
find -type f -empty -delete

This works for plain BSD so it should be universally compatible with all flavors. Below.e.g in pwd (.)
find . -size 0 |  xargs rm

On Linux, the stat(1) command is useful when you don't need find(1):
(( $(stat -c %s "$filename") )) || rm -fv "$filename"

find指令不进行递归查找,只在本层(当前)目录下查找。

-maxdepth levels
Descend at most levels (a non-negative integer) levels of directories below the command line arguments. '-maxdepth 0' means only  apply the tests and actions to the command line arguments.

Your options basically are:
#DO NOT show hidden files (beginning with ".", i.e., .*):
# find DirsRoot/* -maxdepth 0 -type f
Or:
#DO show hidden files:
# find DirsRoot/ -maxdepth 1 -type f

POSIX兼容的方式:
cd DirsRoot && find . -type f -print -o -name . -o -prune

-maxdepth is not POSIX compliant option. With FreeBSD find (used by macOS) you can use the -depth primary.
find . -depth 1 -name '*.csv'

-depth n is equivalent to -mindepth n -maxdepth n, as commented by Stéphane Chazelas.

find(1) - FreeBSD explains:
-depth n
True if the depth of the file relative to the starting point of the traversal is n.

-maxdepth n
Always true; descend at most n directory levels below the command line arguments.  If any -maxdepth primary is specified, it applies to the entire expression even if it would not normally be evaluated.  "-maxdepth 0" limits the whole search to the commandline arguments.

-mindepth n
Always true; do not apply any tests or actions at levels less than n. If any -mindepth primary is specified, it applies to the entire expression even if it would not normally be evaluated. "-mindepth 1" processes all but the command line arguments.

GNU find doesn't support -depth n.


mv
1.作用
mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户。该命令如同DOS命令中的ren和move的组合。
2.格式
mv[options] 源文件或目录 目标文件或目录
3.[options]主要参数
-i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答“y”或“n”,这样可以避免误覆盖文件。
-f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。
4.应用实例
(1)将/usr/cbu中的所有文件移到当前目录(用“.”表示)中: $ mv /usr/cbu/ * .
(2)将文件cjh.txt重命名为wjz.txt: $ mv cjh.txt wjz.txt 

ls
1.作用
ls命令用于显示目录内容,类似DOS下的dir命令,它的使用权限是所有用户。
2.格式
ls [options]
3.options主要参数
-a, --all:不隐藏任何以“.” 字符开始的项目。
-A, --almost-all:列出除了“ . ”及 “.. ”以外的任何项目。
--author:印出每个文件著作者。
-b, --escape:以八进制溢出序列表示不可打印的字符。
--block-size=大小:块以指定的字节为单位。
-B, --ignore-backups:不列出任何以 ~ 字符结束的项目。
-f:不进行排序,-aU参数生效,-lst参数失效。
-F, --classify:加上文件类型的指示符号 (*/=@| 其中一个)。
-g:like -l, but do not list owner。
-G, --no-group:inhibit display of group information。
-i, --inode:列出每个文件的inode号。
-I, --ignore=样式:不印出任何符合Shell万用字符的项目。
-k:即--block-size=1K。
-l:使用较长格式列出信息。
-L, --dereference:当显示符号链接的文件信息时,显示符号链接所指示的对象,而并非符号链接本身的信息。
-m:所有项目以逗号分隔,并填满整行行宽。
-n, --numeric-uid-gid:类似-l,但列出UID及GID号。
-N, --literal:列出未经处理的项目名称,例如不特别处理控制字符。
-p, --file-type:加上文件类型的指示符号 (/=@| 其中一个)。
-Q, --quote-name:将项目名称括上双引号。
-r, --reverse:依相反次序排列。
-R, --recursive:同时列出所有子目录层。
-s, --size:以块大小为序。
4.应用举例
ls命令是Linux系统使用频率最多的命令,它的参数也是Linux命令中最多的。使用ls命令时会有几种不同的颜色,其中蓝色表示是目录,绿色表示是可执行文件,红色表示是压缩文件,浅蓝色表示是链接文件,加粗的黑色表示符号链接,灰色表示是其它格式文件。ls最常使用的是ls- l。 

文件类型开头是由10个字符构成的字符串。其中第一个字符表示文件类型,它可以是下述类型之一:-(普通文件)、d(目录)、l(符号链接)、b(块设备文件)、c(字符设备文件)。后面的9个字符表示文件的访问权限,分为3组,每组3位。第一组表示文件属主的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字符分别表示对文件的读(r)、写(w)和执行权限(x)。对于目录,表示进入权限。s表示当文件被执行时,把该文件的UID或GID赋予执行进程的UID(用户ID)或GID(组 ID)。t表示设置标志位(留在内存,不被换出)。如果该文件是目录,那么在该目录中的文件只能被超级用户、目录拥有者或文件属主删除。如果它是可执行文件,那么在该文件执行后,指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。接着显示的是文件大小、生成时间、文件或命令名称。

diff
1.作用
diff命令用于两个文件之间的比较,并指出两者的不同,它的使用权限是所有用户。
2.格式
diff [options] 源文件 目标文件
3.[options]主要参数
-a:将所有文件当作文本文件来处理。
-b:忽略空格造成的不同。
-B:忽略空行造成的不同。
-c:使用纲要输出格式。
-H:利用试探法加速对大文件的搜索。
-I:忽略大小写的变化。
-n --rcs:输出RCS格式。

cmp
1.作用
cmp(“compare”的缩写)命令用来简要指出两个文件是否存在差异,它的使用权限是所有用户。
2.格式
cmp[options] 文件名
3.[options]主要参数
-l: 将字节以十进制的方式输出,并方便将两个文件中不同的以八进制的方式输出。

cat
1.作用
cat(“concatenate”的缩写)命令用于连接并显示指定的一个和多个文件的有关信息,它的使用权限是所有用户。
2.格式
cat [options] 文件1 文件2……
3.[options]主要参数
-n:由第一行开始对所有输出的行数编号。
-b:和-n相似,只不过对于空白行不编号。
-s:当遇到有连续两行以上的空白行时,就代换为一行的空白行。
4.应用举例
(1)cat命令一个最简单的用处是显示文本文件的内容。例如,我们想在命令行看一下README文件的内容,可以使用命令:
$ cat README
(2)有时需要将几个文件处理成一个文件,并将这种处理的结果保存到一个单独的输出文件。cat命令在其输入上接受一个或多个文件,并将它们作为一个单独的文件打印到它的输出。例如,把README和INSTALL的文件内容加上行号(空白行不加)之后,将内容附加到一个新文本文件File1 中:
$ cat README INSTALL File1
(3)cat还有一个重要的功能就是可以对行进行编号。这种功能对于程序文档的编制,以及法律和科学文档的编制很方便,打印在左边的行号使得参考文档的某一部分变得容易,这些在编程、科学研究、业务报告甚至是立法工作中都是非常重要的。
对行进行编号功能有-b(只能对非空白行进行编号)和-n(可以对所有行进行编号)两个参数: $ cat -b /etc/named.conf

ln
1.作用
ln命令用来在文件之间创建链接,它的使用权限是所有用户。ln link file 的简称是 GNU 核心工具包中的基本工具。该命令是为某个文件在另外一个位置建立一个同步链接。当我们需要在不同的目录用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,此时只需用 ln 创建对应文件的链接,不必重复的占用磁盘空间。命令格式:

# 硬链接source只能是文件
ln source target

# 软链接source可以是文件也可以是目录
ln -s source target

软链接 symbolic link 跟 Windows 里面的快捷方式等价。它的内容是指向另一个文件的位置。所以可以创建某个目录的软链接,也可以对一个不存在的文件进行链接。除此之外,它可以跨文件系统。这三点硬链接都无法实现。

硬链接 hard link 可以理解为文件的别名,而且别名可以有多个。对于 Linux 而言,文件的结构与 Windows 有点类似,由文件名,inode类似于 Windows 下的 FCB 文件控制块,保存文件的一些信息和数据组成。

注意 Inode 和硬链接,创建 origin 的硬链接 hardlink文件。通过stat FILENAME比对发现,创建硬链接的文件 hardlink 与原文件 origin 之间除了名称不同之外其他完全相同,就像同一个人它有个正式的名称也可能会有小名。它们的数据显然完全一样。

接下来创建 origin 的软链接 softlink 文件。对比发现,origin 和 softlink 是完全不同的文件,有着不同的 size,不同的块,不同的 Inode,不同的 type。唯一的联系是 softlink 文件指向 origin 文件有点文件指针的感觉。

2.格式
ln [options] 源文件 [链接名]

3.参数
-f:链结时先将源文件删除。
-d:允许系统管理者硬链结自己的目录。
-s:进行软链结(Symbolic Link)。
-b:将在链结时会被覆盖或删除的文件进行备份。

链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

硬连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。

与硬连接相对应,Lnux系统中还存在另一种连接,称为符号连接(Symbilc Link),也叫软连接。软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

动手练习

上面我们介绍了Linux文件处理命令,下面介绍几个实例,大家可以动手练习一下刚才讲过的命令。

1.利用符号链接快速访问关键目录
符号链接是一个非常实用的功能。假设有一些目录或文件需要频繁使用,但由于Linux的文件和目录结构等原因,这个文件或目录在很深的子目录中。比如,Apache Web服务器文档位于系统的/usr/local/httpd/htdocs中,并且不想每次都要从主目录进入这样一个长的路径之中(实际上,这个路径也非常不容易记忆)。

为了解决这个问题,可以在主目录中创建一个符号链接,这样在需要进入该目录时,只需进入这个链接即可。为了能方便地进入Web服务器(/usr/local/httpd/htdocs)文档所在的目录,在主目录下可以使用以下命令: $ ln -s /usr/local/httpd/htdocs gg

这样每次进入gg目录就可访问Web服务器的文档,以后如果不再访问Web服务器的文档时,删除gg即可,而真正的Web服务器的文档并没有删除。

2.使用dd命令将init.rd格式的root.ram内容导入内存
dd if=/dev/fd0 of=floppy.fd
dd if=root.ram of=/dev/ram0 #

3.grep命令系统调用
grep是Linux/Unix中使用最广泛的命令之一,许多Linux系统内部都可以调用它。
(1)如果要查询目录列表中的目录,方法如下:
$ ls -l | grep '∧d'
(2)如果在一个目录中查询不包含目录的所有文件,方法如下:
$ ls -l | grep '∧[∧d]'
(3)用find命令调用grep,如所有C源代码中的“Chinput”,方法如下:
$find /ZhXwin -name *.c -exec grep -q -s Chinput {} \;-print

4.删除源文件对软硬链接的影响
rm -fv origin

由stat命令可以看出 hardlink 中硬链接的个数少了一个,而 softlink 还是安然无恙的存在着。接着我们通过两个链接来打开文件,可以发现,hardlink 依旧能打开文件,而软链接却无法查看原文件。

(n)cal

Linux系统内置两个可在终端用来显示和校准日历的cal命令和ncal命令。一旦习惯使用它们,会发现使用命令很多时候都比你运用鼠标在GUI的日历里查看要来的更迅速和方便。命令行下有许多参数,这些参数能完成您所需要的所有关于日历的需求,目前来说,还没有发现我需要显示的一种日历的需求是它没有的。

ncal命令比cal命令更强大。它以垂直格式显示日历,并提供更多其他选项。这些包括显示复活节的日期,以周一或周日作为开始日期查看日历等等。以下简单的ncal命令用于以当前月份的垂直格式查看日历,并突出显示当前日期。

命令选项
可以根据以下nval语法查看日历,具体取决于以下选项:
ncal [-m [month]] [-y [year]] [-h] [-3] [-1] [-A [number]] [-B [number]] [-d [YYYY-MM]] [-C] [-e] [-o] [-p] [-w] [-M] [-S] [-b]

注意:已经为cal命令解释的选项可以以相同的方式用于ncal命令。

选项 使用
-h 默认情况下,cal命令会突出显示今天的日期。 但是,如果使用-h选项,则不会突出显示日期。
-e 使用此选项可查看西部日历的复活节日期。
-o 使用此选项可查看东正教复活节的日期。
-p 使用此选项可查看用于从该国家/地区的Julian切换到Gregorian日历的国家/地区代码和切换天数。
-w 当您使用此选项时,ncal将在每个星期下打印周号。
-C 通过使用此选项,您可以将cal命令的所有选项与ncal命令一起使用。
-M 使用此选项可以查看星期一作为一周中第一天的日历。
-S 使用此选项可以查看星期日作为一周中第一天的日历。
-b 当您使用此选项时,ncal将通过cal命令水平显示日历

示例:

以下命令将显示当前月份的日历,而不突出显示今天的日期:
nacl -h

以下命令将显示当前月份的日历,其中星期一为一周的第一天。
nacl -m
ncal -S
ncal -encal -o
ncal -w
ncal -p

通过使用这些选项可以自定义查看日历的方式,而不是通常的方式在Linux中显示日历。

tee

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时还可以保存成文件;用于读取标准输入的数据,并将其内容输出成文件,简单的说就是把数据重定向到给定文件和屏幕上。

由于存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收完从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。

日常使用过程中既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee命令了。tee命令读取标准输入,把这些内容同时输出到标准输出和(多个)文件中(read from standard input and write to standard output and files. Copy standard input to each FILE, and also to standard output. If a FILE is -, copy again to standard output.)。在info tee中说道:tee命令可以重定向标准输出到多个文件(tee: Redirect output to multiple files. The tee command copies standard input to standard output and also to any files given as arguments. This is useful when you want not only to send some data down a pipe, but also to save a copy.)。

要注意的是:在使用管道线时,前一个命令的标准错误输出不会被tee读取。

语法
tee [-ai][--help][--version][文件...]

参数:
-a或--append    附加到既有文件的后面,而非覆盖它.
-i或--ignore-interrupts    忽略中断信号。
--help    在线帮助。
--version    显示版本信息。

格式:tee
只输出到标准输出,因为在此没有指定文件。

格式:tee file
输出到标准输出的同时,保存到文件file中。如果文件不存在,则创建;如果已经存在,则覆盖之(If a file being written to does not already exist, it is created. If a file being written to already exists, the data it previously contained is overwritten unless the -a option is used.)

格式:tee -a file
输出到标准输出的同时,追加到文件file中。如果文件不存在,则创建;如果已经存在,就在末尾追加内容,而不是覆盖。

格式:tee -
输出到标准输出两次(A FILE of - causes tee to send another copy of input to standard output, but this is typically not that useful as the copies are interleaved.)

格式:tee file1 file2 -
输出到标准输出两次,同时保存到file1和file2中。

格式:ls "*" 2>&1 | tee ls.txt
把标准错误输出也保存到文件

常见问题

Q1如何在 Linux 上使用这个命令
ping google.com | tee output.txt

这个输出内容不仅被写入 output.txt 文件,也被显示在标准输出中。

Q2如何确保 tee 命令追加信息到文件中
默认情况下,在同一个文件下再次使用 tee 命令会覆盖之前的信息。如果你想的话,可以通过 -a 命令选项改变默认设置。
[command] | tee -a [file]

基本上,-a 选项强制 tee 命令追加信息到文件。

Q3如何让 tee 写入多个文件
这非常之简单,仅仅只需要写明文件名即可。
[command] | tee [file1] [file2] [file3]

比如:ping google.com | tee output1.txt output2.txt output3.txt

Q4如何让 tee 命令的输出内容直接作为另一个命令的输入内容
使用 tee 命令,你不仅可以将输出内容写入文件,还可以把输出内容作为另一个命令的输入内容。比如说,下面的命令不仅会将文件名存入 output.txt 文件中,还会通过 wc 命令让你知道输入到 output.txt 中的文件数目。

Q5如何使用 tee 命令提升文件写入权限
假如在使用 vim 编辑器 打开文件,并且做了很多更改,然后当尝试保存修改时得到一个报错,让意识到那是一个 root 所拥有的文件,这意味着你需要使用 sudo 权限保存修改。

如此情况下,你可以(在 vim 内)使用 tee 命令来提高权限。
:w !sudo tee %

上述命令会向你索要 root 密码,然后就能让你保存修改了。

Q6如何让 tee 命令忽视中断
-i 命令行选项使 tee 命令忽视通常由 ctrl+c 组合键发起的中断信号(SIGINT)。
[command] | tee -i [file]

当想要使用 ctrl+c 中断该命令,同时让 tee 命令优雅的退出,这个选项尤为实用。


Linux系统中使用以下命令来查看文件的内容:
cat  由第一行开始显示文件内容
tac  从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl   显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只开头几行
tail 只看结尾几行

cat
由第一行开始显示文件内容

语法:cat [-AbEnTv]

选项与参数:
-A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字节 $ 显示出来;
-n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符

tac
与cat命令刚好相反,文件内容从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

nl
显示行号

语法:nl [-bnw] 文件

选项与参数:
-b:指定行号指定的方式,主要有两种:
-b a:表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t:如果有空行,空的那一行不要列出行号(默认值);
-n:列出行号表示的方法,主要有三种:
-n ln:行号在荧幕的最左方显示;
-n rn:行号在自己栏位的最右方显示,且不加 0 ;
-n rz:行号在自己栏位的最右方显示,且加 0 ;
-w:行号栏位的占用的位数。

more
一页一页翻动,在 more 这个程序的运行过程中,有几个按键可以按的:
空白键 (space):代表向下翻一页;
Enter:代表向下翻『一行』;
/字串:代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
:f:立刻显示出档名以及目前显示的行数;
q:代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b:代表往回翻页,不过这动作只对文件有用,对管线无用。

less
一页一页翻动,less运行时可以输入的命令有:
空白键:向下翻动一页;
[pagedown]:向下翻动一页;
[pageup]:向上翻动一页;
/字串:向下搜寻『字串』的功能;
?字串:向上搜寻『字串』的功能;
n:重复前一个搜寻 (与 / 或 ? 有关!)
N:反向的重复前一个搜寻 (与 / 或 ? 有关!)
q:离开 less 这个程序;

head
取出文件前面几行

语法:head [-n number] 文件

选项与参数:
-n :后面接数字,代表显示几行的意思

tail
取出文件后面几行

语法:tail [-n number] 文件

选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测


Linux 磁盘常规管理常用三个命令为 df、du 与 fdisk

df(英文全称:disk free):列出文件系统的整体磁盘使用量
du(英文全称:disk used):检查磁盘空间使用量
fdisk:用于磁盘分区
fsck:用于文件系统检验

df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

语法:df [-ahikHTm] [目录或文件名]

选项与参数:
-a:列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k:以 KBytes 的容量显示各文件系统;
-m:以 MBytes 的容量显示各文件系统;
-h:以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H:以 M=1000K 取代 M=1024K 的进位方式;
-T:显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i:不用硬盘容量,而以 inode 的数量来显示

du 命令也是查看使用空间的,但与 df 命令不同的是 du 命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍 Linux du 命令。

语法:du [-ahskm] 文件或目录名称

选项与参数:
-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已;
-h:以人们较易读的容量格式 (G/M) 显示;
-s:列出总量而已,而不列出每个各别的目录占用容量;
-S:不包括子目录下的总计,与 -s 有点差别;
-k:以 KBytes 列出容量显示;
-m:以 MBytes 列出容量显示。

直接输入 du 没有加任何选项时,则会分析当前所在目录里的子目录所占用的硬盘空间。与 df 不一样的是,du 命令其实会直接到文件系统内去搜寻所有的文件数据。

fdisk

fdisk 是 Linux 的磁盘分区表操作工具。

语法:fdisk [-l] 装置名称

选项与参数:
-l:输出后面接的装置所有的分区内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来。

fsck(file system check)用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题时可利用fsck命令对文件系统进行检查。

语法:fsck [-t 文件系统] [-ACay] 装置名称

选项与参数:
-t:给定档案系统的型式,若在 /etc/fstab 中已有定义或 kernel 本身已支援的则不需加上此参数
-s:依序一个一个地执行 fsck 的指令来检查
-A:对/etc/fstab 中所有列出来的 分区(partition)做检查
-C:显示完整的检查进度
-d:打印出 e2fsck 的 debug 结果
-p:同时有 -A 条件时,同时有多个 fsck 的检查一起执行
-R:同时有 -A 条件时,省略 / 不检查
-V:详细显示模式
-a:如果检查有错则自动修复
-r:如果检查有错则由使用者回答是否修复
-y:选项指定检测每个文件是自动输入yes,在不确定那些是不正常的时候,可以执行 # fsck -y 全部检查修复。


od

od(octal dump)命令可以以八进制(默认)、十进制、十六进制和ASCII码的格式来显示文件或者流,它们对于访问或可视地检查文件中不能直接显示在终端上的字符(如换行符等)很有用。此外在一些有空洞的文件中可以通过od命令查看空洞的位置。可以帮助用户查看文件的二进制数据,以及进行数据的转换和处理。

语法如下:
od [-aBbcDdeFfHhIiLlOosvXx] [-A base] [-j skip] [-N length] [-t type] [[+]offset[.][Bb]] [file ...]
od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]
od [-A 地址进制] [-t 显示格式] 文件名
od [选项] [文件名]

其中,选项可以用来指定输出格式、偏移量、字节长度等。文件名是要显示内容的文件名。

常用选项:

-A:指定输出格式(地址进制信息),可选的格式包括d(十进制)、o(八进制:系统默认值)、x(十六进制)和n(ASCII码)。

-j:指定偏移量,可以用来跳过文件的前几个字节。

-N:指定要显示的字节长度。

-t:指定数据类型,可选的类型包括a(ASCII字符)、c(字符)、d(有符号十进制数)、f(浮点数)、o(八进制数)、u(无符号十进制数)和 x(十六进制数)。显示格式的主要参数有:
c:ASCII字符或反斜杠序列(如\n)
d:有符号十进制数
f:浮点数
o:八进制(系统默认值)
u:无符号十进制数
x:十六进制数

常用参数:

-a此参数的效果和同时指定”-ta”参数相同
-A选择要以何种基数计算字码
-b此参数的效果和同时指定”-toC”参数相同
-c此参数的效果和同时指定”-tC”参数相同
-d此参数的效果和同时指定”-tu2″参数相同
-f此参数的效果和同时指定”-tfF”参数相同
-h此参数的效果和同时指定”-tx2″参数相同
-i此参数的效果和同时指定”-td2″参数相同
-j<字符数目>略过设置的字符数目
-l此参数的效果和同时指定”-td4″参数相同
-N<字符数目>到设置的字符数目为止
-o此参数的效果和同时指定”-to2″参数相同
-s<字符串字符数>只显示符合指定的字符数目的字符串
-t<输出格式>设置输出格式
-v输出时不省略重复的数据
-w<每列字符数>设置每列的最大字符数
-x此参数的效果和同时指定”-h”参数相同
--help查看帮助信息
--version显示版本信息


应用示例

下面是一些od命令的示例,以帮助你更好地理解其用法:

显示文件的十六进制内容:
od -t x1 file.txt

显示文件的八进制内容:
od -t o1 file.txt

显示文件的ASCII码内容:
od -t c file.txt

跳过文件的前100个字节,显示接下来的10个字节的十进制内容:
od -j 100 -N 10 -t d file.txt

显示文件的前20个字符的ASCII码内容:
od -N 20 -t a file.txt

应用场景

od在Linux系统中有着广泛的应用场景,例如:
- 文件分析:通过查看文件的二进制数据,可以帮助用户了解文件的内部结构,从而进行文件分析和调试。

- 数据转换:od命令可以将文件的内容转换为不同的格式,方便用户进行数据转换和处理。

- 数据提取:通过指定偏移量和字节长度,可以提取文件中的特定数据,以满足用户的需求。

od命令是Linux系统中一个强大的文件内容显示工具,它可以以不同的格式输出文件的内容,帮助用户进行文件分析、数据转换和数据提取。通过灵活运用od命令的选项,用户可以根据自己的需求来显示和处理文件的内容。



该文章最后由 阿炯 于 2024-01-24 17:23:25 更新,目前是第 2 版。