iOS高级强化--013:Shell常用命令

ag命令

ag:超快的文件搜索工具,与grep相比,搜索速度更快。

语法:

ag [可选项] [匹配模式] [路径]
  • 由于模式可以是一个正则表达式,使得搜索功能极为强大

示例:

ag -A 3 [匹配模式]
  • ag会遍历当前目录下的文本文件,在每个文件的每一行中查找这种模式,把文件名、行号和匹配的内容高亮显示出来,同时显示了匹配行数的后三行。-C/--context [LINES],输出匹配内容前后[LINES]行内容(默认两行)

在某个指定的目录下搜索,或只搜索某个文件的内容,在搜索的字符串后面加上路径

ag [匹配模式] [路径]

ag -G还提供了强大的过滤功能,使搜索在特定的文件中进行。例如:只搜索 .m文件

ag -G ".+\.m" [匹配模式] [路径]

ag根据输入智能判定大小写的匹配方式。如果查询的字符串只含有小写字符,使用大小写不敏感的匹配方式;如果出现了大写字符,就改为大小写敏感的匹配方式。如果想要直接使用不敏感的匹配方式,可以使用ag -i选项

另一个很有用的选项是ag -w的全词匹配,它要求匹配的字符串前后都需要有合适的分隔符

如果想要搜索不满足特定模式的行,用ag -v对搜索结果取反

如果只关心有哪些文件匹配(而不在意文件的内容),可以用ag -l显示有匹配的文件名,类似的ag -L显示没有任何匹配的文件名

参考文档:ag命令

c++filt命令

c++filt命令可用于解析C++Java中被修饰的符号,比如变量与函数名称。

语法:

c++filt [-_|--strip-underscore]
        [-n|--no-strip-underscore]
        [-p|--no-params]
        [-t|--types]
        [-i|--no-verbose]
        [-s format|--format=format]
        [--help] [--version] [symbol...]
  • 如果没有给出符号参数[symbol…]c++filt将从标准输入中读取符号名称

示例:

解析编译器g++修饰的函数名称

c++filt -s gnu-v3 _Z5printRKSs
-------------------------
print(std::basic_string, std::allocator > >const&)

解析编译器g++修饰的函数名称,但不显示函数参数类型

c++filt -p _Z5printRKSs
-------------------------
print

解析编译器g++修饰的变量名称

c++filt _ZL5dTest
-------------------------
dTest

参考文档:c++filt命令

tree命令

tree命令以树状图列出目录的内容。

语法:

tree [选项] [目录]
  • 执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件

示例:

列出目录/private/第一级文件名

tree  /private/ -L 1

忽略文件夹

tree -I node_modules # 忽略当前目录文件夹node_modules
tree -P node_modules # 列出当前目录文件夹node_modules的目录结构
tree -P node_modules -L 2 # 显示目录node_modules两层的目录树结构
tree -L 2 > /home/www/tree.txt # 当前目录结果存到 tree.txt 文件中

忽略多个文件夹

tree -I 'node_modules|icon|font' -L 2

非树状结构列出目录/private/下的所有文件

tree -if /private/

参考文档:tree命令

cp命令

cpcopy的缩写,cp命令用于复制文件/文件夹。

语法:

cp [选项] [源目录/源文件] [目标目录/目标文件]

示例:

复制一个文件

cp test.txt test1.txt

复制多个文件

cp test.txt test1.txt test
  • cp源文件1,源文件2至目标目录

复制一个目录

cp -r test test1

复制多个目录

cp -r test test1 test2
  • cp -r源目录1,源目录2至目标目录

参数:

-a, --archive                     等于-dR --preserve=all--backup[=CONTROL 为每个已存在的目标文件创建备份
-b                                类似--backup 但不接受参数--copy-contents 在递归处理是复制特殊文件内容
-d                                等于--no-dereference --preserve=links
-f, --force                       如果目标文件无法打开则将其移除并重试(当 -n 选项存在时则不需再选此项)
-i, --interactive                 覆盖前询问(使前面的 -n 选项失效)
-H                                跟随源文件中的命令行符号链接
-l, --link                        链接文件而不复制
-L, --dereference                 总是跟随符号链接
-n, --no-clobber                  不要覆盖已存在的文件(使前面的 -i 选项失效)
-P, --no-dereference              不跟随源文件中的符号链接
-p                                等于--preserve=模式,所有权,时间戳--preserve[=属性列表 保持指定的属性
                                 (默认:模式,所有权,时间戳),如果可能保持附加属性:环境、链接、xattr 等
-R, -r, --recursive               复制目录及目录内的所有项目
-t --target-directory=DIRECTORY   将所有源文件拷贝到目标目录
-T, --no-target-directory         目标为文件而不是文件夹

参考文档:cp命令

ln命令

用来为文件创建链接。

所谓的链接(link),可以将其视为档案的别名,而链接又可分为两种:

硬链接(hard link),意思是一个档案可以有多个名称

  • 硬链接,以文件副本的形式存在。但不占用实际空间
  • 不允许给目录创建硬链接
  • 硬链接只有在同一个文件系统中才能创建

软链接(symbolic link),意思是产生一个特殊的档案,该档案的内容是指向另一个档案的位置

  • 软链接,以路径的形式存在。类似于快捷方式
  • 软链接可以跨文件系统,硬链接不可以
  • 软链接可以对一个不存在的文件名进行链接
  • 软链接可以对目录进行链接

语法:

ln [选项]...[-T] [目标] [链接名]
ln [选项]...[目标]
ln [选项]...[目标]...[目录]
ln [选项]... -t [目录] [目标]...

示例:

将目录/usr/mengqc/mub1下的文件m2.c,链接到目录/usr/liu下的文件a2.c

ln /mub1/m2.c /usr/liu/a2.c
  • 在执行ln命令之前,目录/usr/liu中不存在a2.c文件。执行ln之后,在/usr/liu目录中才有a2.c这一项,表明m2.ca2.c链接起来(二者在物理上是同一文件),利用ls -l命令可以看到链接数的变化

在目录/usr/liu下建立一个符号链接文件abc,使它指向目录/usr/mengqc/mub1

ln -s /usr/mengqc/mub1 /usr/liu/abc
  • 执行该命令后,/usr/mengqc/mub1代表的路径将存放在名为/usr/liu/abc的文件中

参考文档:ln命令

sed命令

通常要进行文本处理,sed是一个非常强大的文本处理命令工具。 配合正则表达式可以进行文本搜索、替换、插入、删除等操作。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变。

语法:

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

参考文档:sed命令

grep命令

grep命令全称是Global Regular Expression Print,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

规则表达式:

^:锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$:锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
.:匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。    
*:匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。    
.*:一起用代表任意字符。   
[]:匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。    
[^]:匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。    
\(..\):标记匹配字符,如'\(love\)',love被标记为1。    
\<:锚定单词的开始,如:'\:锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。    
x\{m\}:重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。    
x\{m,\}:重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。    
x\{m,n\}:重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。   
\w:匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。   
\W:\w的反置形式,匹配一个或多个非单词字符,如点号句号等。   
\b:单词锁定符,如: '\bgrep\b'只匹配grep。 

参考文档:grep命令

ls命令

ls命令用来显示目标列表。

语法:

ls [选项] [文件名...]
   [-1abcdfgiklmnopqrstuxABCDFGLNQRSUX] [-w cols] [-T cols] [-I pattern] [--full-time] 
   [--format={long,verbose,commas,across,vertical,single-col‐umn}] 
   [--sort={none,time,size,extension}] [--time={atime,access,use,ctime,status}] 
   [--color[={none,auto,always}]] [--help] [--version] [--]

示例:

ls -l
-------------------------
total 32
drwxr-xr-x  6 zang  staff   192  3 15 18:13 Common Symbol
-rwxr-xr-x@ 1 zang  staff  2122  3 17 14:43 xcode_run_cmd.sh
  • 第一个栏位,表示文件的属性。基本上分为三个属性:可读(r),可写(w),可执行(x
  • 第二个栏位,表示文件个数。如果是文件的话,那这个数目自然是1了,如果是目录的话,那它的数目就是该目录中的文件个数了
  • 第三个栏位,表示该文件或目录的拥有者。若使用者目前处于自己的Home,那这一栏大概都是它的账号名称
  • 第四个栏位,表示所属的组(group)。每一个使用者都可以拥有一个以上的组,不过大部分的使用者应该都只属于一个组,只有当[系统管理员]希望给予某使用者特殊权限时,才可能会给他另一个组
  • 第五栏位,表示文件大小。文件大小用byte来表示,而空目录一般都是1024byte,当然可以用其它参数使文件显示的单位不同,如使用ls –k就是用kb显示一个文件的大小单位,不过一般我们还是以byte为主
  • 第六个栏位,表示最后一次修改时间。以月,日,时间的格式表示,如Aug 15 5:46表示8月15日早上5:46分
  • 第七个栏位,表示文件名。我们可以用ls –a显示隐藏的文件名

其中第一个栏位:

分为三个属性:可读(r),可写(w),可执行(x

数字表示:1表示可执行权限,2表示可写权限,4表示可读权限

第一个字母表示文件类型:

  • -:普通文件
  • d:目录,是dirtectory的缩写
  • l:符号链接
  • b:块设备文件
  • c:字符设备文件

紧接着的3*3个字符,对应ownergroupothers3组,表示此文件在各组的读、写、执行权限

因为Linux/Unix是多用户多任务系统,所以一个文件可能同时被许多人使用,所以我们一定要设好每个文件的权限():

-rwxr-xr-x为例:rwx(Owner)r-x(Group)r-x(Other)

–rwxr-xr-x转换成权限数字为755

  • rwx4+2+1=7
  • r-x4+1=5
  • r-x4+1=5

参考文档:ls命令

stat命令

stat命令用于显示文件或文件系统的详细信息。在显示文件信息时,比ls命令更加详细。

语法:

stat [选项] [参数]

选项:

-L, --dereference:跟随符号链接解析原文件而非符号链接;
-f, --file-system:显示文件所在文件系统信息而非文件信息;
-c, --format=FORMAT:以指定格式输出,而非默认格式;
--printf=FORMAT:以指定格式输出,而非默认格式。与--format作用类似,但可以解释反斜杠转义字符,比如换行符\n;
-t, --terse:简洁模式输出,只显示摘要信息;
--help:显示帮助信息;
--version:显示版本信息。

显示文件信息可用格式控制符如下:

%a:以八进制显示访问权限
%A:以可读形式显示访问权限
%b:显示占有块数
%B:显示每一块占有的字节数
%C:SELinux security context string
%d:十进制显示文件所在设备号
%D:十六进制显示文件所在设备号
%f:十六进制显示文件类型
%F:文件类型。Linux下文件类型主要分为普通文件、目录、字符设备文件、块设备文件、符号链接文件、套接字等
%g:文件所有者组ID
%G:文件所有者组名称
%h:文件硬链接数
%i:inode号
%m:文件所在磁盘分区挂载点,比如/data
%n:文件名称
%N:单引号括起来的文件名称,如果是软链接,则同时显示指向的文件名称
%o:optimal I/O transfer size hint
%s:实际文件大小,单位字节
%t:major device type in hex, for character/block device special files
%T:minor device type in hex, for character/block device special files
%u:所有者用户ID
%U:所有者用户名称
%w:文件创建时间,输出-表示无法得知
%W:文件创建时间,输出Unix时间戳,0表示无法得知
%x:可读形式输出最后访问时间atime
%X:Unix时间戳输出最后访问时间atime
%y:可读形式输出最后修改时间mtime
%Y:Unix时间戳输出后修改时间mtime
%z:可读形式输出最后状态改变时间ctime
%Z:Unix时间戳输出最后状态改变时间ctime

显示文件系统信息可用格式控制符有:

%a:非超级用户可使用的自由block数
%b:文件系统总block数
%c:文件系统总文件节点数
%d:可用文件节点数
%f:可用文件block数
%i:十六进制文件系统ID
%l:最大文件名称长度
%n:文件名称
%s:一个块的大小,单位字节(for faster transfers)
%S:一个块的基本大小,单位字节(用于统计block的数量)
%t:十六进制输出文件系统类型
%T:可读形式输出文件系统类型

参考文档:stat命令

你可能感兴趣的:(iOS高级强化--013:Shell常用命令)