《Linux 高级程序设计(第三版)》——1.3 部分常用工具简介

简介:

本节书摘来自异步社区《Linux 高级程序设计(第三版)》一书中的第1章,第1.3节,作者:杨宗德 , 吕光宏 , 刘雍著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.3 部分常用工具简介

Linux 高级程序设计(第三版)
1.3.1 tar打包器
如果要发布包含大量程序和文档的程序,则需对其进行打包压缩。在Shell命令行下,可以使用的文件压缩工具有:gzip、bzip2和zip。相应的压缩和解压工具如表1-5所示。
screenshot

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;
……
相关文章
|
6月前
|
NoSQL Linux 开发工具
【Linux】常用工具(下)
【Linux】常用工具(下)
361 2
|
7月前
|
Linux 开发工具
18.4 【Linux】systemd-journald.service 简介
18.4 【Linux】systemd-journald.service 简介
68 0
|
7月前
|
Linux iOS开发 UED
Linux简介和比较:开源操作系统的优势与差异
Linux简介和比较:开源操作系统的优势与差异
196 0
|
4月前
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
14天前
|
传感器 Linux API
嵌入式Linux串口编程简介
嵌入式Linux串口编程简介
13 1
|
6月前
|
关系型数据库 MySQL Unix
Linux 目录结构简介
Linux 目录结构简介
|
2月前
|
存储 Linux
|
3月前
|
人工智能 Linux Shell
Linux——vim简介、配置方案(附带超美观的配置方案)、常用模式的基本操作
Linux——vim简介、配置方案(附带超美观的配置方案)、常用模式的基本操作
|
3月前
|
Ubuntu Linux
Linux文件目录简介
Linux文件目录简介
|
8月前
|
Unix Linux C语言
【Linux系统简介】
【Linux系统简介】
76 0