本节书摘来自异步社区《Linux 高级程序设计(第三版)》一书中的第1章,第1.3节,作者:杨宗德 , 吕光宏 , 刘雍著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.3 部分常用工具简介
Linux 高级程序设计(第三版)
1.3.1 tar打包器
如果要发布包含大量程序和文档的程序,则需对其进行打包压缩。在Shell命令行下,可以使用的文件压缩工具有:gzip、bzip2和zip。相应的压缩和解压工具如表1-5所示。
tar类型的文件是几个文件和(或)目录在一个文件中的集合,tar命令用来创建备份和归档。tar使用的选项有以下几项。
-c:创建一个新归档。
-x:从归档中抽取文件。即解压缩。
-j:压缩/解压bz2格式tar文件。
-z:压缩/解压gz格式tar文件。
-f:当与-c选项一起使用时,创建的tar文件使用该选项指定的文件名;当与-x选项一起使用时,则解除该选项指定文件的归档。
-t:显示包括在tar文件中的文件列表。
-v:显示文件的归档进度。
命令的tar具体使用如下所示。
(1)创建一个tar文件。
[root@localhost root]# tar -cvf filename.tar directory/file //创建打包文件filename.tar
filename.tar代表要创建的文件,directory/file代表想放入归档文件内的文件和目录。可以使用tar命令同时处理多个文件和目录,方法是将它们逐一列出,并用空格间隔:
[root@localhost root]# tar –cvf filename.tar /home/mine/work /home/mine/school
上面的命令把/home/mine目录下的work和school子目录内的所有文件都放入当前目录中一个叫做filename.tar的新文件里。要列出tar文件的内容,键入:
[root@localhost root]# tar -tvf filename.tar //列出打包文件内容
(2)解压一个tar文件。
[root@localhost root]# tar –xvf filename.tar //解压打包文件
(3)创建一个bz2格式tar文件。
[root@localhost root]# tar –cjvf filename.tar.bz2 directory/file //创建用bz2压缩过的打包文件
(4)创建一个gzip格式tar文件。
[root@localhost root]# tar –czvf filename.tar.gz directory/file //创建用gzip压缩过的打包文件
(5)解压一个bz2格式tar文件。
[root@localhost root]# tar –xjvf filename.tar.bz2 //解压用bz2压缩过的打包文件
(6)解压一个gzip格式tar文件。
[root@localhost root]# tar –xzvf filename.tar.gz //解压用gzip压缩过的打包文件
1.3.2 Linux常用命令及工具
1.expand
expand用于将输入制表符转换为空格,unexpand将输入空格转换为制表符。使用-t选项来指定制表符停止位,示例如下:
[root@localhost ~]# cat -A hello.c //使用cat –A显示文档所有字符信息
#include <stdio.h>$
int main(int argc,char* argv[])$
{$
^Iprintf("hello.world1!\n");^I^I^I//test1$ //TAB制表符显示为^I
^Iprintf("hello.world2!\n");^I^I^I//test2$
}$
[root@localhost ~]# cat hello.c //cat查看,其中制表符为8个字符
#include <stdio.h>
int main(int argc,char* argv[])
{
printf("hello.world1!\n"); //打印信息hello.world1!,用于测试
printf("hello.world2!\n"); //test2
}
[root@localhost ~]# expand -t 4 hello.c //设置制表符为4个字符
#include <stdio.h>
int main(int argc,char* argv[])
{
printf("hello.world1!\n");
printf("hello.world2!\n");
}
2.grep搜索字符串
grep用来在指定文件中搜索关键字符串,这在查找头文件函数声明时使用较多。其命令格式如下:
grep [选项] [查找内容] [查找范围]
b:在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量。
c:只显示匹配行的数量。
i:比较时不区分大小写。
h:在查找多个文件时,指示grep不要将文件名加入到输出之前。
l:显示首次匹配串所在的文件名并用换行符将其隔开。当在某文件中多次出现匹配串时,不重复显示此文件名。
n:在输出前加上匹配串所在行的行号(文件首行行号为1)。
v:只显示不包含匹配串的行。
x:整行显示严格匹配的行。
例如,在Linux头文件目录中查找fread函数声明位置,可以使用以下命令:
[root@localhost ~]# grep -b fread /usr/include/*.h //-b用来显示匹配位置
/usr/include/stdio_ext.h:1845:extern int __freading (FILE *__fp) __THROW;
/usr/include/stdio_ext.h:2175:extern int __freadable (FILE *__fp) __THROW;
/usr/include/stdio.h:20167:extern size_t fread (void *__restrict __ptr, size_t __size,
/usr/include/stdio.h:21301:extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
3.find查找文件
find命令用于使用多种方式来查找某一文件的位置。其命令格式如下:
find 查找路径 [参数] [字符串对象]
(1)以名称和文件属性为条件查找。
其主要参数如下。
-name字符串:查找文件名匹配所给字符串的所有文件,字符串内可用通配符*、?及[ ]。
-lname 字符串:查找文件名匹配所给字符串的所有符号连接文件,字符串内可用通配符*、?及[ ]。
-gid n:查找ID号为n的用户组的所有文件。
-uid n:查找ID号为n的用户的所有文件。
-group字符串:查找用户组名为所给字符串的所有文件。
-user字符串:查找用户名为所给字符串的所有文件。
-empty:查找大小为0的目录或文件。
-path字符串:查找路径名匹配所给字符串的所有文件,字符串内可用通配符*、?及[ ]。
-perm权限:查找具有指定权限的文件和目录,权限的表示如711、644。
-size n[bckw]:查找指定文件大小的文件,n后面的字符表示单位,默认为b,代表512字节的块。
-type x:找类型为x的文件,x为b(块设备文件)、c(字符设备文件)、d(目录文件)、p(命名管道(FIFO))、f(普通文件)、l(符号连接文件)或s(socket文件)。
例如,在/usr/include文件夹下查找文件名为stdio.h的文件,其命令如下:
[root@localhost ~]# find /usr/include/ -name stdio.h //在目录/usr/include中查找文件stdio.h
/usr/include/stdio.h
/usr/include/bits/stdio.h
(2)以时间为条件查找。其主要参数如下。
amin n:查找n分钟以前被访问过的所有文件。
atime n:查找n天以前被访问过的所有文件。
cmin n:查找n分钟以前文件状态被修改过的所有文件。
ctime n:查找n天以前文件状态被修改过的所有文件。
mmin n:查找n分钟以前文件内容被修改过的所有文件。
mtime n:查找n天以前文件内容被修改过的所有文件。
(3)可执行的操作。
exec命令名称{ }:对符合条件的文件执行所给的Linux命令,而不询问用户是否需要执行该命令。{}表示命令的参数即为所找到的文件;命令的末尾必须以“ ;”结束。
-ok命令名称{ }:对符合条件的文件执行所给的Linux命令,与exec不同的是,它会询问用户是否需要执行该命令。
4.AWK工具
AWK是一种用于处理文本的编程语言工具。AWK实用工具的语言在很多方面类似于shell编程语言,尽管AWK具有完全属于其本身的语法。最初创造AWK的目的是用于处理文本,并且这种语言的基础是只要在输入数据中有模式匹配,就执行一系列指令。该实用工具依次扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。其命令语法结构如下:
awk '{pattern + action}' {filenames}
其中pattern表示AWK在文件中查找的内容,而action是在找到匹配内容时所执行的一系列命令。
AWK将每个输入行信息分为记录和字段。
记录是单行的输入,记录的分隔符是换行,每条记录包含若干字段。
默认的字段分隔符是空格或制表符。
当AWK读取输入内容时,整条记录被分配给变量$0。各字段以字段分隔符分开,被分配给变量$1、$2、$3,依次增加序号。
如以下命令:
[root@localhost ~]# cat hello.c //hello.c文件内容
#include <stdio.h> //<stdio.h>前有空格
int main(int argc,char* argv[]) //main前面有空格
{
printf("hello.world1!\n"); //注释前面有制表位
printf("hello.world2!\n"); //注释前面有制表位
}
[root@localhost ~]# awk '{print $1}' hello.c //打印所有行的第一个字段
#include
int
{
printf("hello.world1!\n");
printf("hello.world2!\n");
}
AWK主要用于表格信息处理中,关于AWK更多操作请参阅AWK手册。
5.sort命令
sort按字母次序打印命令行上指定的文件内容,也接受用管道传送的输入。sort命令是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。
sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,则该命令将继续比较这两行的下一字符,如果仍然相同,将继续进行比较。其语法结构如下:
sort [选项] 文件
sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成。排序关键字定义了用来排序的字符序列。默认情况下以整行为关键字,按ASCII字符顺序进行排序。
改变默认设置的选项主要有:
-m:若给定文件已排序,则合并文件。
-c:检查给定文件是否已排好序,如果没有排序,则打印出错信息,并以状态值1退出。
-u:对排序后认为相同的行只保留其中一行。
-o:输出文件将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,则sort先将该文件的内容写入一个临时文件,然后再排序,写输出结果。
改变缺省排序规则的选项主要有:
-d:按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。
-f:将小写字母与大写字母同等对待。
-I:忽略非打印字符。
-M:作为月份比较,如“JAN”<“FEB”<1/4<“DEC”。
-r:按逆序输出排序结果。
+pos1-pos2:指定一个或几个字段作为排序关键字,字段位置从pos1开始,到pos2为止(包括pos1,不包括pos2)。如不指定pos2,则关键字为从pos1到行尾。字段和字符的位置从0开始。例如,以第2个字段作为排序关键字对文件example的内容进行排序的命令如下:
[root@localhost ~]# sort +1-2 example
-b:在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。
-t:separator指定字符separator作为字段分隔符。
6.其他有用的命令
(1)nl命令用于为输入的每一行添加行号。
[root@localhost ~]# nl /etc/xinetd.d/cvs
1 # default: off
2 # description: The CVS service can record the history of your source \
3 # files. CVS stores all the versions of a file in a single \
4 # file in a clever way that only stores the differences \
……
(2)wc命令用于打印指定文件或输入流(来自管道)中的行、字和字节的数量。
(3)head命令用于打印文件或流的前十行。使用-n选项来指定应显示的行数。
(4)tail命令用于打印文件或流的最后十行。使用-n选项来指定应显示的行数。
(5)tac与cat类似,但它以逆向顺序打印所有行,即先打印最后一行。
(6)paste命令用于获取两个或更多文件作为输入,连接输入文件上的每个后续行,并输出结果行。它对于创建文本的表或列是很有用的。
(7)od命令用于将输入流转换为八进制或十六进制的“转储”格式。
7.常用键盘组合键命令
在进行程序开发和设计时,经常会用到部分键盘组合键,常用的组合键盘命令如下:
^C:中断程序。
^:^S:结束程序。
^Z:挂起程序。
部分其他命令可以使用以下命令查看:
[root@localhost ~]# stty -a //键盘组合命令,实为键盘中断信号,见第8章信号
speed 38400 baud; rows 27; columns 90; line = 0; //^C表示ctrl+c
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 1; time = 0;
……