PA/Linux 常用工具

积累一些Linux下常用工具,以后继续添加

git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
git init初始化
git add "readme.txt"
git commit -m "something's changed"
git status
git diff readme.txt
git log
git log --pretty=oneline
git reset --hard HEAD^ 100个^等于HEAD~100
git reflog
git checkout --readme.txt回到最近一次commit或add可还原被删文件
git reset HEAD readme.txt
git rm删除文件同rm
touch README 添加README文件
ssh-keygen -t rsa -C "xxx@qq.com"
H:hexo\blog>ssh-keygen -t rsa -C "....@qq.com"
ssh -T git@github.com
git remote add origin git@github.com:KarlRixon/learngit.git
git push -u origin master
git push -all -f 强行上传
git push origin master
git clone git@github.com:KarlRixon/gitskills.git
git clone url,,,慢
git remote rm origin
git pull git@github.com:xxx/xxx.git
git remote add ,,, git@,,,,,
git push -u ,,, master

tmux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
C-b ? 显示快捷键帮助
C-b C-o 调换窗口位置,类似与vim 里的C-w
C-b 空格键 采用下一个内置布局
C-b ! 把当前窗口变为新窗口
C-b " 模向分隔窗口
C-b % 纵向分隔窗口
C-b q 显示分隔窗口的编号
C-b o 跳到下一个分隔窗口
C-b 上下键 上一个及下一个分隔窗口
C-b ALT-方向键 调整分隔窗口大小
C-b c 创建新窗口
C-b 0~9 选择几号窗口
C-b c 创建新窗口
C-b n 选择下一个窗口
C-b l 切换到最后使用的窗口
C-b p 选择前一个窗口
C-b w 以菜单方式显示及选择窗口
C-b t 显示时钟
C-b ; 切换到最后一个使用的面板
C-b x 关闭面板
C-b & 关闭窗口
C-b s 以菜单方式显示和选择会话
C-b d 退出tumx,并保存当前会话,这时,tmux仍在后台运行,可以通过tmux attach进入 到指定的会话

gdb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
start 开始调试
step/s 跳入函数
list 列出代码
n 执行吓一条语句
bt 查看函数调用的栈帧
i/info 查看函数局部变量
f/frame 查看main函数局部变量
p/print arg 打印变量值
finish 函数运行到当前函数返回为止
set var sum=0 设置变量值
break/b 行号 设置断点
break 函数名 在函数开头设置断点
break ,,, if ,,, 设置条件断点
continue/c 从当前位置连续运行
delete breakpoints 断点号 删除断点
display 变量名 跟踪查看变量 每次停下来都显示其值
disable 断点号 禁用断点
enable 断点号 启用断点
info/i breakpoints 查看设置了哪些断点
run/r 从头开始运行
undisplay 跟踪显示号 取消跟踪显示
watch 变量名 设置观察点
info watchpoints 查看观察点
x/7b input 从input数组第一个字节开始打印7个字节

regex

标准字符集合:

1
2
3
4
5
6
7
8
9
10
\d 匹配数字
\w 字母 数字 下划线 汉字
\s 空白符
. 任意字符
\D 非数字
\W 非 字母 数字 下划线 汉字
自定义字符集合:
[abcd] 匹配abcd字符
[^abcd] 匹配除abcd的字符
[a-p0-7] 匹配a到p和07的字符

匹配方法

1
2
3
4
5
6
7
8
\d\d\d\d 匹配四位连续数字
\d{10} 匹配十位连续数字
(规则){10} 规则重复十次
\d{m,n} 至少重复m次 至多重复n次
\d{m,} 最少重复m次
+等价于{1,}
?等价于{0,1}
*等价于{0,}

匹配模式

1
2
3
4
5
6
IGNORECASE 忽略大小写模式
SINGLELINE 单行模式
MULTILINE 多行模式
贪婪模式 匹配的字符符合表达式越多越好
勉强模式 匹配的字符符合表达式越少越好
在表示匹配次数的表达式后面加?则会改为非贪婪模式

反向引用

1
\nnn 对每一对()编号

预搜索(零宽断言)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
判断当前位置的前后字符是否符合指定条件 但不匹配前后字符 是对位置的匹配
(?=exp)断言自身位置后能匹配exp
(?<=exp)自身位置前能匹配exp
(?!exp)自身位置后不能匹配exp
(?<!exp)自身位置前不能匹配exp


^ 与字符串开始的地方匹配 ^ab
$ 与字符串结束的地方匹配 ab$
\b 匹配一个单词边界 boy\b aaaboy匹配
| 或

([\w-]+)@([\w-]+)(\.[a-zA-Z]{2,5})+ 邮箱格式匹配
<(A-Za-z)+>.+</\1> 匹配标签中的字符串

vim

配置/etc/vim/vimrc文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
setlocal noswapfile " 不要生成swap文件
set bufhidden=hide " 当buffer被丢弃的时候隐藏它
set nocompatible " 关闭 vi 兼容模式
syntax on " 自动语法高亮
colorscheme evening " 设定配色方案
set number " 显示行号
set cursorline " 突出显示当前行
set ruler " 打开状态栏标尺
set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格
set tabstop=4 " 设定 tab 长度为 4
set nobackup " 覆盖文件时不备份
set autochdir " 自动切换当前目录为当前文件所在的目录
filetype plugin indent on " 开启插件
set backupcopy=yes " 设置备份时的行为为覆盖
set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
set incsearch " 输入搜索内容时就显示搜索结果
set hlsearch " 搜索时高亮显示被找到的文本
set noerrorbells " 关闭错误信息响铃
set novisualbell " 关闭使用可视响铃代替呼叫
set t_vb= " 置空错误铃声的终端代码
set showmatch " 插入括号时,短暂地跳转到匹配的对应括号
set matchtime=2 " 短暂跳转到匹配括号的时间
set magic " 设置魔术
set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
set smartindent " 开启新行时使用智能自动缩进
set backspace=indent,eol,start " 不设定在插入状态无法用退格键和 Delete 键删除回车符
set cmdheight=1 " 设定命令行的行数为 1
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ Ln\ %l,\ Col\ %c/%L%) " 设置在状态行显示的信息
set foldenable " 开始折叠
set foldmethod=syntax " 设置语法折叠
set foldcolumn=0 " 设置折叠区域的宽度
setlocal foldlevel=1 " 设置折叠层数为 1
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> " 用空格键来开关折叠

键位图


常用命令

博客链接

tree

参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-a 显示所有文件和目录。
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 在文件和目录清单加上色彩,便于区分各种类型。
-d 显示目录名称而非内容。
-D 列出文件或目录的更改时间。
-f 在每个文件或目录之前,显示完整的相对路径名称。
-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号。
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
-i 不以阶梯状列出文件或目录名称。
-I<范本样式> 不显示符合范本样式的文件或目录名称。
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
-n 不在文件和目录清单加上色彩。
-N 直接列出文件和目录名称,包括控制字符。
-p 列出权限标示。
-P<范本样式> 只显示符合范本样式的文件或目录名称。
-q 用"?"号取代控制字符,列出文件和目录名称。
-s 列出文件或目录大小。
-t 用文件和目录的更改时间排序。
-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
-x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

常见的用法:

1
2
3
4
5
6
7
8
9
10
11
tree -a 显示所有

tree -d 仅显示目录

tree -L n n代表数字..表示要显示几层...

tree -f 显示完整路径..

当然tree支持重定向至文件...

tree -L 4 >dirce.doc即可生成UTF8格式的文档..我们也可以在windows 下查看..

cloc

统计一个 tar 包中的代码行

1
cloc xxx.tar.gz

统计项目目录中的代码行数

1
cloc ./

objdump

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
--archive-headers 
-a
显示档案库的成员信息,类似ls -l将lib*.a的信息列出。

-b bfdname
--target=bfdname
指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如:

objdump -b oasys -m vax -h fu.o
显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。

-C
--demangle
将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。

--debugging
-g
显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。

-e
--debugging-tags
类似-g选项,但是生成的信息是和ctags工具相兼容的格式。

--disassemble
-d
从objfile中反汇编那些特定指令机器码的section。

-D
--disassemble-all
与 -d 类似,但反汇编所有section.

--prefix-addresses
反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。

-EB
-EL
--endian={big|little}
指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records.

-f
--file-headers
显示objfile中每个文件的整体头部摘要信息。

-h
--section-headers
--headers
显示目标文件各个section的头部摘要信息。

-H
--help
简短的帮助信息。

-i
--info
显示对于 -b 或者 -m 选项可用的架构和目标格式列表。

-j name
--section=name
仅仅显示指定名称为name的section的信息

-l
--line-numbers
用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

-m machine
--architecture=machine
指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.

--reloc
-r
显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。

--dynamic-reloc
-R
显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。

-s
--full-contents
显示指定section的完整内容。默认所有的非空section都会被显示。

-S
--source
尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。

--show-raw-insn
反汇编的时候,显示每条汇编指令对应的机器码,如不指定--prefix-addresses,这将是缺省选项。

--no-show-raw-insn
反汇编时,不显示汇编指令的机器码,如不指定--prefix-addresses,这将是缺省选项。

--start-address=address
从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。

--stop-address=address
显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出。

-t
--syms
显示文件的符号表入口。类似于nm -s提供的信息

-T
--dynamic-syms
显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D|--dynamic 显示的信息。

-V
--version
版本信息

--all-headers
-x
显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。

-z
--disassemble-zeroes
一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。

@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。

示例参考博客

objcopy

常用选项

  • input-file、outfile

参数input-file和outfile分别表示输入目标文件(源目标文件)和输出目标文件(目的目标文件)。如果在命令行中没有明确地指定outfile,objcopy将创建一个临时文件来存放目标结果,然后使用input-file的名字重命名这个临时文件(此时,原来的input-file将被覆盖)。

  • -I bfdname或–input-target=bfdname

用来指明源文件的格式,bfdname是BFD库中描述的标准格式名。如果不指明源文件格式,objcopy会自己去分析源文件的格式,然后去和BFD中描述的各种格式比较,从而得知源文件的目标格式名。

  • -O bfdname或–output-target=bfdname

使用指定的格式来输出文件,bfdname是BFD库中描述的标准格式名。

  • -F bfdname或–target=bfdname

同时指明源文件、母的文件的格式。将源目标文件中的内容复制到目的目标文件的过程中,只进行复制不做格式转换,源目标文件是什么格式,目的目标文件就是什么格式。

  • -R sectionname或–remove-section=sectionname

从输出文件中删掉所有名为sectionname的段。该选项可以多次使用

  • -S或–strip-all

不从源文件中复制重定位信息和符号信息到目标文件中去。

  • -g或–strip-debug

不从源文件中复制调试符号到目标文件中去。

readelf

ELF文件有下面三种类型:

1.目标文件

$ gcc -c test.c
得到的test.o就是目标文件,目标文件通过链接可生成可执行文件。
静态库其实也算目标文件,静态库是通过ar命令将目标打包为.a文件。
如:ar crv libtest.a test.o

2.可执行文件
$gcc -o test test.c
得到的test文件就是可执行的二进制文件。

3.共享库
$ gcc test.c -fPIC -shared -o libtest.so
得到的文件listtest.so就是共享库。

选项

-a
–all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I.

-h
–file-header 显示elf文件开始的文件头信息.

-l
–program-headers
–segments 显示程序头(段头)信息(如果有的话)。

-S
–section-headers
–sections 显示节头信息(如果有的话)。

-g
–section-groups 显示节组信息(如果有的话)。

-t
–section-details 显示节的详细信息(-S的)。

-s
–syms
–symbols 显示符号表段中的项(如果有的话)。

-e
–headers 显示全部头信息,等价于: -h -l -S

-n
–notes 显示note段(内核注释)的信息。

-r
–relocs 显示可重定位段的信息。

-u
–unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息。

-d
–dynamic 显示动态段的信息。

-V
–version-info 显示版本段的信息。

-A
–arch-specific 显示CPU构架信息。

-D
–use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。

-x
–hex-dump= 以16进制方式显示指定段内内容。number指定段表中段的索引,或字符串指定文件中的段名。

-w[liaprmfFsoR] or
–debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。

-I
–histogram 显示符号的时候,显示bucket list长度的柱状图。

-v
–version 显示readelf的版本信息。

-H
–help 显示readelf所支持的命令行选项。

-W
–wide 宽行输出。

@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。

gcc

gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。

选项

-o:指定生成的输出文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
-c:仅执行编译操作,不进行连接操作。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. git
  2. 2. tmux
  3. 3. gdb
  4. 4. regex
    1. 4.1. 标准字符集合:
    2. 4.2. 匹配方法
    3. 4.3. 匹配模式
    4. 4.4. 反向引用
    5. 4.5. 预搜索(零宽断言)
  5. 5. vim
    1. 5.1. 配置/etc/vim/vimrc文件
    2. 5.2. 键位图
    3. 5.3. 常用命令
  6. 6. tree
    1. 6.1. 参数
    2. 6.2. 常见的用法:
  7. 7. cloc
    1. 7.1. 统计一个 tar 包中的代码行
    2. 7.2. 统计项目目录中的代码行数
  8. 8. objdump
    1. 8.1. 选项
  9. 9. objcopy
    1. 9.1. 常用选项
  10. 10. readelf
    1. 10.1. ELF文件有下面三种类型:
    2. 10.2. 选项
  11. 11. gcc
    1. 11.1. 选项