├── .gitignore
├── APT.md
├── Compress.md
├── Directory.md
├── File.md
├── IRC.md
├── Net.md
├── README.md
├── System.md
├── Tips.md
├── Yum.md
├── adb.md
├── awk.md
├── bash
├── README.md
└── fc.md
├── bc.md
├── crontab.md
├── fdisk.md
├── find.md
├── ftp.md
├── gcc.md
├── gdb.md
├── git.md
├── grep.md
├── hexdump.md
├── install.md
├── ipcmk.md
├── ipcrm.md
├── ipcs.md
├── lsof.md
├── make.md
├── makefile.md
├── mpstat.md
├── nc.md
├── netstat.md
├── pacman.md
├── rpm.md
├── samba.md
├── scp.md
├── sed.md
├── ssh.md
├── tcpdump.md
├── telnet.md
├── traceroute.md
├── tree.md
├── vim
├── Normal模式.md
├── README.md
├── Tips.md
├── Visual模式.md
└── 命令模式.md
├── vmstat.md
├── whereis.md
└── 过滤器
├── README.md
└── split.md
/.gitignore:
--------------------------------------------------------------------------------
1 | *.html
2 | *~
3 |
--------------------------------------------------------------------------------
/APT.md:
--------------------------------------------------------------------------------
1 | 软件
2 | ====
3 | 注意!本文探讨的关于软件操作的命令属于`系统相关`的命令,仅适用于Debian系列衍生版。
4 | - [x] Debian
5 | - [x] Ubuntu
6 | - [ ] Red Hat
7 | - [ ] Cent OS
8 |
9 | ## 卸载软件
10 | 卸载命令有多条,但是不可获缺的一个操作是首先要知道该软件的包名
11 | ```bash
12 | dpkg -l|grep wps
13 | ```
14 | 上述命令用于Debian系列Linux系统中。dpkg软件包管理机制中的 `-l` 参数能显示已安装软件的列表。接下来的`grep wps` 是查找和wps相关的软件包。
15 | 屏幕上会可能显示出一个
16 |
17 | wps-office
18 |
19 | 然后我们执行卸载命令
20 | ```
21 | sudo apt-get purge wps-office
22 | 或者
23 | dpkg -p wps-office
24 | ```
25 | -p参数等同于--purge
26 | ## aptitude
27 | `aptitude`是个比apt-get更高级的包管理工具,它在解决依赖性问题上更胜一筹。不过它没有被预装,要自己安装。
28 |
29 | sudo apt-get aptitude
30 | 卸载命令形如:
31 |
32 | sudo aptitude wine1.6
33 | 会自动解决依赖问题。
34 | ### 暴力卸载软件
35 | 如果温柔的卸载方式,不起作用的话,那么就来点暴力的,直接删除。
36 |
37 | 1. 安装文件如果在/目录中,那么一般位置,就是/usr/local。
38 | 2. 但是即使删除以后,在软件管理器中还会残留这个软件的图标,此时是无效链接了。
39 | 3. 删除残留文件,残留文件一般在/usr/share中有其文件夹,在/usr/share/applications中有其图标。
40 |
41 | ## PPA
42 | Personal Package Archives,其实就是非官方的源
43 | ### 添加PPA
44 |
45 | sudo add-apt-repository ppa:atareao/atareao
46 | `ppa:`后面的就是源了。
47 | ### 删除PPA
48 | sudo add-apt-repository -r ppa:atareao/atareao
49 |
50 | ### 删除PPA
51 | 1. 进入源目录删除
52 |
53 | cd /etc/apt/sources.list.d/
54 | 在里面找到对应的`.list`文件删除就可以了。
55 | 2. 使用工具ppa-purge
56 |
57 | sudo apt-get install ppa-purge
58 | sudo ppa-purge ppa:/atareao/atareao
59 | 这个工具也需要另外下载。同样的`ppa:`后面的就是源了。
60 | ### 出现依赖问题的解决办法
61 | sudo apt-get -f install
62 | 将自动安装依赖文件及要安装的软件
63 | ## 更新与升级
64 | ### update
65 |
66 | sudo apt-get update
67 | 更新的是软件包的列表
68 | ### upgrade
69 |
70 | sudo apt-get upgrade
71 | 依据软件包列表将软件更新到最新版本
72 | ### dist-upgrade
73 |
74 | sudo apt-get dist-upgrade
75 | 与`upgrade`基本相同,不同之处是本命令会智能的解决依赖冲突问题。而`upgrade`则不会。
76 | ### do-release-upgrade
77 |
78 | sudo apt-get do-release-upgrade
79 | 发行版升级。貌似只能一代一代的升级,不能直接升级最新版。
80 |
--------------------------------------------------------------------------------
/Compress.md:
--------------------------------------------------------------------------------
1 | 压缩解压
2 | ========
3 | Linux系统中常见的压缩文件格式(后缀名)有gz、bz、zip、rar和Z。
4 | >`*.Z`类型为compress软件压缩的格式,目前已经退出历史舞台,被gzip取代。
5 |
6 | 打包和压缩是两个概念。打包只是单纯将多个文件合并成一个文件。
7 | 比如常见的`*.tar`后缀的是打包文件而不是压缩文件。
8 | >尽管如此,tar也提供了压缩功能的选项。在打包之后再进行一次压缩,比如`*.tar.gz`文件。
9 |
10 | ## gzip
11 | gzip全称GNU zip。最简单的用法就是gzip直接跟文件名,用来压缩。
12 | gzip test.sh
13 | 这样会生成test.sh.gz的文件。但是原文件会消失。加上`-k`选项则会保留原文件
14 |
15 | |选项|英文释义|描述|
16 | |----|----|----
17 | |d|decompress|解压
18 | |r|recursive|压缩目录
19 | 另有`gunzip`可以用于解压.gz的文件,效果同gzip -d。注意:
20 | gzip -d foo 可以解压foo.gz文件
21 | ### zcat
22 | zcat可以在不解压`*.gz`文件的情况下,打印压缩文件的内容到屏幕。
23 | ## bzip2
24 | bzip2比gzip有更好的一个压缩比。但其使用方法,选项和参数都和gzip相同。
25 |
26 | 相应的bzip2有一个`bzcat`。
27 | ## tar
28 | 确切说,tar是打包工具而不是压缩工具,但是也提供了借助gzip或bzip2来压缩的选项。
29 | tar命令的选项可以不加`-`,比如常用的`tar xvf *.tar.gz`
30 |
31 | |常用选项|英文全称|描述|
32 | |:------:|:----:|----
33 | |c|create|创建文件|
34 | |C|change DIR|指定解压路径|
35 | |f|file|指定文件名,f后要紧跟文件名|
36 | |j||利用bzip2来压缩|
37 | |J||利用xz来压缩|
38 | |p|permissions|保留原文件的权限和属性|
39 | |v|verbose|显示正在压缩/解压的文件|
40 | |x|extract|解压缩|
41 | |z||利用gzip来压缩|
42 | ### c
43 | 在不压缩只打包的时候不加c会报错。
44 | tar cvf abc.tar abc/
45 | ### f
46 | tar -zcv -f abc.tar.gz abc/
47 | >因为f后面要紧跟文件名,所以最好将-f选项单独写出来,而不是组合使用
48 |
49 | ## xz
50 | xz是linux上最有效的压缩功能,现在被用来储存Linux内核文件。
51 | 它压缩速度慢,但是提供更高的压缩率。
52 |
53 | |命令|描述|
54 | |----|----|
55 | |xz _*_|压缩当前目录下所有文件,缀以.xz,不打包|
56 | |xz foo|压缩foo文件为foo.xz,如果成功,会删除foo文件|
57 |
58 | |选项|全命令|描述|
59 | |----|----|----|
60 | |c|stdout|解压(非)压缩文件到标准输出|
61 | |d|decompress|解压.xz文件,默认替换掉压缩文件|
62 | |k|keep|解压之后不删除原文件|
63 | ## zip/unzip
64 | ### zip
65 | zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
66 | 最简单用法,zip+压缩后的文件名+要压缩的文件。如:
67 | zip jdk-docs.zip jdk-doc/
68 | ### unzip
69 | unzip 直接跟文件名,就能解压文件到当前目录。
70 | unzip jdk-docs.zip
71 |
72 | |常用选项|英文全称|描述
73 | |:------:|:------:|----|
74 | |d|directory|指定解压路径
75 | |I||指定为UNIX的字符集
76 | |n|never|从不覆盖已存在的文件
77 | |o|overwite|覆盖文件,不产生任何提示
78 | |O||指定为Dos,Windows或OS/2中的字符集
79 | 有些Windows下压缩的文件,在解压后中文会出现乱码,这是由于编码不一致造成的。
80 | 图形化的解压工具无法指定编码格式,此时必须要借助unzip命令。
81 |
82 | unzip -O cp936 xxx.zip
83 | **cp936**为Windows的默认编码格式,也即GBK,据测试也可指定为gb2312编码。
84 | >指定编码的时候,大小写不敏感
85 |
86 | ## rar
87 | 格式
88 |
89 | rar <命令选项> 压缩包名称 [要操作的文件]
90 |
91 | |常用选项|英文全称|描述
92 | |:------:|:------:|----|
93 | |a|add|给压缩包内添加文件|
94 | |d|delete|删除压缩包内某文件|
95 | |e|extract|提取文件到当前目录,不创建新目录|
96 | ## unrar
97 | 注意,改命令选项不加-
98 |
99 |
--------------------------------------------------------------------------------
/Directory.md:
--------------------------------------------------------------------------------
1 | 目录操作
2 | ========
3 | 目录本身也是一种文件。与一般文件不同,它有一些特殊操作
4 | ---------------------
5 | 本节中的部分命令同样适用于普通文件。
6 | ## dirs+pushd+popd
7 | 三者维护一个目录栈。目录栈的栈顶即是当前目录,所以可以通过改变目录栈栈顶元素的方法来切换到其他目录。
8 |
9 | |命令|描述|
10 | |----|----|
11 | |dirs|显示名称|
12 | |dirs -c|除当前目录外,移除栈中所有目录|
13 | |dirs -l|显示完整名称|
14 | |dirs -v|每行一个目录,并有数字标识|
15 | |pushd *dir*|把目录dir压入栈中|
16 | |pushd +n|把数字标识为n的目录移到栈顶|
17 | |popd|弹出栈顶|
18 | |popd +n|弹出数字标识为n的目录|
19 | ## du
20 | du显示的是文件所占用块的大小,所以有时候会大于实际的大小。
21 |
--------------------------------------------------------------------------------
/File.md:
--------------------------------------------------------------------------------
1 | 文件
2 | ===
3 | 文件包括普通文件和目录文件
4 | ----
5 | >目录文件就是Windows中常说的文件夹,文件夹也是一种特殊的文件。所以文件夹的名字和普通文件也不能重名!通常文件夹被称作目录(directory)更为贴切些,因为一般都用directory的缩写`d`来表示文件夹。
6 |
7 | ## 新建目录mkdir
8 | mkdir test
9 | 会新建一个目录test。
10 |
11 | |常用选项|描述|
12 | |:----:|:----|
13 | |p|当要新建的目录已经存在时不报错|
14 |
15 | ## 进入目录cd
16 | cd是change directory的缩写
17 |
18 | cd document
19 | 进入document这个文件夹。
20 | ### 特殊的目录
21 | |符号|描述|
22 | |:------:|------|
23 | |/|根目录|
24 | |~|用户目录|
25 | |-|刚才所在目录|
26 | |.|当前目录|
27 | |..|上一级目录|
28 | 切换到某一目录的时候都有相对路径和绝对路径两种表达。
29 |
30 | 比如当前所在目录为/usr,切换到/usr/local。可使用如下两个命令:
31 |
32 | cd /usr/local
33 | cd ./local
34 | 第二个命令可简写为`cd local`
35 | 然后再回到/usr目录可使用如下命令:
36 |
37 | cd /usr
38 | cd ..
39 | cd -
40 |
41 | >直接`cd`不加参数也相当于执行了`cd ~`,这是进入宿主目录的快捷方式
42 |
43 | ## cp
44 | 复制文件。
45 | 复制目录时要加上-r或-a选项。
46 |
47 | cp -r test/ test2/
48 | cp -a test/ test2/
49 | 此时若不存在目录test2,那么会新建。
50 | ## ls
51 |
52 | `ls`为list的意思。可以列出当前目录的各种信息。
53 | 默认是列出子文件,子目录的信息。且会对结果排序,并加色彩高亮。
54 | ### 选项
55 | |常用选项|描述|
56 | |:----:|:----|
57 | |a|all,可以显示出全部文件,包括隐藏文件|
58 | |d|显示当前目录自身的信息,而不是列出子目录,子文件的信息|
59 | |F|显示信息的时候加上flag标识|
60 | |f|关闭`ls --color`,打开**aU**选项
61 | |h|human-readable与l联用,将文件大小(byte)改为更可读的效果(K,M)|
62 | |l|long,可以列出完整的信息|
63 | |U|不排序,按条目在目录项中的顺序列出
64 | 使用时比如`ls -l`,也可以组合多个参数,比如`ls -al`
65 | ### -F
66 | |文件类型|flag标识|
67 | |:------:|:--------:|
68 | |可执行文件|`*`|
69 | |符号链接|`@`|
70 | |目录文件|`/`|
71 | ### -l
72 | 显示的完整信息,比如
73 |
74 | drwxr-xr-x 8 jelly jelly 4096 7月 2 11:51 document/
75 | 注意时间为创建时间,而非最后访问或修改的时间。第二个字段8为document目录所包含的link(目录项)的数量。
76 | 因为所有目录都会有 . 和..这两个目录,所以实际document所包含的子目录为6个。
77 | >>有个很常用的命令`ll`,Ubuntu中这是`ls -alF`的别名。
78 |
79 | ## chmod
80 |
81 | chmod [who][opt][mode] 文件/目录名
82 |
83 | |who|u|g|o|a|
84 | |---|----|----|----|----|
85 | |描述|文件所有者|同组用户|其他用户|所有用户|
86 |
87 | |opt|+ |- |= |
88 | |---|-----|------|------|
89 | |描述|添加某一权限|取消某一权限|赋予给定权限,取消原权限|
90 |
91 | |权限|描述|
92 | |----|----|
93 | |r|读
94 | |w|写
95 | |x|执行
96 | |X|只有目标文件对某些用户是可执行的或该文件是目录才追加x属性
97 | |s|在文件执行时把进程的属主或组ID置为该文件的属主。
98 | |t|设置粘着位(sticky bit),防止文件或目录被非属主删除
99 | s的用法是u+s,g+s。
100 | 当用户身份变化时,即使该文件对其他用户无执行权限,也会执行。
101 |
102 | 可以使用`chmod 数字`来改权限。
103 | r、w、x分别为4,2,1。没有权限则为0,三位相加算作一位。
104 | 对于s,t,是第四位。写的时候在最开始位置,这一位的取值可位4,2,1。
105 | * 4.执行时设置用户ID。
106 | * 2.执行时设置用户组ID。
107 | * 1.设置粘着位t。
108 |
109 | 比如:`chmod 4755 file`
110 | ## chown
111 | 改变文件所有者
112 |
113 | chown guodong a.c
114 | chown guodong.guodong a.c
115 | chown guodong:guodong a.c
116 | 改变所有者,第二个第三个改变所有者及所有组。
117 | >另外有命令**chgrp**用来修改文件所有组。
118 |
119 | ### 选项
120 | - [x] h
121 |
122 | 默认情况下,修改符号链接的所有者,实际是在修改它所引用的文件。
123 | **-h**选项就会指定修改的是符号链接而非所引用的文件。
124 |
125 | ## mv
126 | `mv`为move的意思。
127 |
128 | mv a.c project/
129 | 移动文件a.c到project目录下。
130 |
131 | mv Qt/ software/
132 | 因为目录文件也是文件,所以目录名后面的`/`可以省略。
133 | >注意!如果存在software文件夹,那么上述命令将该文件夹移动的software文件夹下面,如果不存在的话,那么上述命令只会完成将Qt文件夹`重命名`为software的操作。
134 |
135 | ## 修改Linux下文件名
136 | ### 简单方案----mv
137 |
138 | mv a.c b.c
139 | >rename命令不是这样用的,会涉及正则表达式,简单地重命名rename会显得繁琐
140 | >rename的写法用了Perl的语法
141 | >复杂但却能更好地批量修改
142 |
143 | ### 批量修改----rename
144 | 我的文件夹下有好几个实验报告的doc文档。命名如:南昌大学实验报告1.doc,南昌大学实验报告2.doc……
145 |
现在我想把它们文件名中的南昌大学改成操作系统
146 |
147 | rename 's/南昌大学/操作系统/' *.doc
148 |
149 | 前提是我这文件夹里并无其他的doc文档。这里的rename 使用了类sed的语法。两个参数,第二个参数是目标文件,这不多说。
150 | 第一个参数是规则,其中的s表示的是替换。然后三个斜杠内含两个字符串,指的就是把前面的字符串替换为后面的。
151 |
152 | ## 链接(link)
153 | link分为两种符号链接和硬链接
154 | ### 符号链接
155 |
156 | ln -s ~/document/readme.txt readlink.txt
157 | 在当前目录下建立一个符号链接readlink.txt指向用户的document目录下的readme.txt
158 |
159 | 当使用`ls -F`查看时,readlink.txt会显示
160 |
161 | readlink.txt@
162 | >注意,如果你的源路径是相对路径,那么当你移动该符号链接的时候,链接可能会失效。
163 |
164 | ### 硬链接
165 | `ln`不加参数就是硬链接,硬链接是再添加一个指向原来inode的文件。硬链接不能链接目录。如果硬链接指向的原文件被删除,那么硬链接不会变成无效链接。
166 | 而符号链接会无效。
167 |
168 | ## 查看文件最后修改时间
169 |
170 | stat 文件名
171 | ## 查看命令的所在位置
172 |
173 | which java
174 | which adb
175 | type java
176 | which可以显示java,adb的所在位置
177 | type可以显示是shell的内部命令还是外部命令。外部命令会指出所在位置。
178 | type也能指出是否是别名。
179 |
--------------------------------------------------------------------------------
/IRC.md:
--------------------------------------------------------------------------------
1 | 即时聊天工具IRC
2 | =======
3 | ## 常用软件
4 | - XChat
5 | - Pidgin
6 | - irssi(命令行irc)
7 |
8 | ## 命令
9 | IRC的命令是以**/**打头的,如`/help`
10 | ### /help
11 | 获取命令使用帮助。
12 | `/help 命令` 可以查看某一命令的帮助
13 | ### /connect
14 | 连接服务器。必须要先登录一个服务器才能聊天。用法如:
15 |
16 | /connect irc.freenode.net
17 | ### /quit
18 | 退出服务器
19 | ### /nick
20 | /nick 昵称,用于修改昵称
21 | ### /join
22 | 加入某个频道
23 | ### /part
24 | 可退出当前频道
25 | ### /msg
26 |
--------------------------------------------------------------------------------
/Net.md:
--------------------------------------------------------------------------------
1 | 网络设置
2 | ========
3 | ## ifconfig
4 | 配置网络地址接口,显示MAC地址,用冒号`:`分割。
5 | >Windows下是使用`ipconfig/all`显示MAC地址,用`-`分割。
6 |
7 | ## 域名
8 | 域名分几个等级:根域(.)、顶级域(com,net,org...)、二级域(baidu,sina...)...主机(www)
9 |
10 | 在浏览器地址栏输入域名,比如`baidu.com`浏览器会自动的补全**www**,但如果你使用`baidu.com.`(.为根域),那么浏览器不会自动补全,你需要自己补全。
11 | ## hosts文件
12 | 古老的一个域名和ip地址映射文件,目前不鼓励使用,但是所有系统都保留该文件。
13 | 尽管保存位置不尽相同(ubuntu是/etc/hosts),但是功能都支持。系统一般是先查找hosts文件,然后查找DNS文件。
14 | ## 虚拟网卡
15 | ifconfig eth0:1 192.168.2.3
16 | `eth0:1`为虚拟网卡名,接着可以`:2`,`:3`...
17 |
18 | ## chkconfig
19 | Ubuntu的启动机制Upstart是没有chkconfig的,只有包含SysV中init启动机制的系统才有chkconfig
20 | ### 列出所有开机自启的服务
21 | chkconfig --list
22 | ### 在自启动列表中添加/删除服务
23 | chkconfig --add NAME
24 | chkconfig --del NAME
25 | NAME指的是服务的名称
26 | ## traceroute
27 | 检查到达某一主机中间所经过的主机。默认为udp包。 Windows上类似的命令叫做tracert
28 | `traceroute www.baidu.com`
29 | ## -I
30 | 发送icmp报文。有时候,如果使用了路由器,会导致udp包的响应功能消失。从而显示星号。
31 | 此时可以使用-I选项(或-T,不过有时候-T不管用)
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | README
2 | ======
3 | Weapon
4 | 本目录中介绍Linux常用的工具,还有常用操作及其命令
5 |
6 | ## 综合文件
7 |
8 | |名称|描述|
9 | |:-------------:|-----|
10 | |[过滤器](Filter.md)|文本过滤相关工具和命令介绍|
11 | |[文件](File.md)|Ubuntu下文件操作的命令介绍|
12 | |[系统](System.md)|Linux系统,磁盘管理相关介绍|
13 | |[压缩](Compress.md)|压缩,解压及打包的工具命令介绍|
14 | |[网络](Net.md)|网络状态及配置相关命令
15 |
16 | ## 常用工具
17 |
18 | |名称|描述|
19 | |:-------------:|-----|
20 | |[adb](adb.md)|跨平台安卓手机管理调试工具|
21 | |[awk](awk.md)|与sed齐名
22 | |[bc](bc.md)|支持浮点运算及其他功能的高级计算器|
23 | |[fdisk](fdisk.md)|硬盘分区工具
24 | |[gcc](gcc.md)|GNU/Linux下C语言编译器|
25 | |[gdb](gdb.md)|GNU/Linux下C语言调试器|
26 | |[git](git.md)|我个人的git命令学习日志
27 | |[grep](grep.md)|常用支持正则表达式的搜索工具|
28 | |[hexdump](hexdump.md)|十六进制查看器|
29 | |[make](make.md)|编译C/C++大型程序的make命令
30 | |[sed](sed.md)|Stream Editer常用文本处理工具|
31 | |[tree](tree.md)|文件的树形结构显示
32 | |[Vim](vim/)|Unix/Linux下强大的编辑器|
33 |
34 | ## 软件包管理
35 | - [x] Debian/Ubuntu
36 | * [APT](APT.md)
37 | * [dpkg](dpkg)
38 | - [x] Red Hat/CentOS
39 | * [Yum](Yum.md)
40 | * [rpm](rpm.md)
41 | - [x] Arch Linux
42 | * [pacman](pacman.md)
43 |
44 | ## 系统检测工具
45 |
46 | |名称|描述
47 | |---|---
48 | |[tcpdump](tcpdump.md)|经典的网络抓包工具
49 | |[ifconfig](ifconfig.md)
50 | |[lsof](lsof.md)|列出系统打开的文件描述符
51 | |[nc](nc.md)|
52 | |[starce](starce.md)|
53 | |[netstat](netstat.md)|网络信息统计工具
54 | |[vmstat](vmstat.md)|**实时**输出系统中各种资源的使用情况
55 | |[ifstat](ifstat.md)|
56 | |[mpstat](mpstat.md)|监测统计每个CPU状态
57 | |[iostat](iostat.md)|
58 |
59 | ## 网络服务与工具
60 |
61 | |名称|描述
62 | |----|----
63 | |[网络](Net.md)|网络配置相关命令
64 | |[cron](cron.md)|计划任务
65 | |[ftp](ftp)|ftp命令
66 | |[samba](samba)|Linux与Windows通信服务
67 | |[ssh](ssh)|ssh有关的工具和命令
68 | |[telnet](telnet.md)|telent远程登陆
69 |
70 | ## 过滤器
71 | * [一般过滤器](Filter.md)
72 | * [grep](grep.md)
73 | * [sed](sed.md)
74 |
75 | [各种技巧](Tips.md)
76 |
--------------------------------------------------------------------------------
/System.md:
--------------------------------------------------------------------------------
1 | 系统管理
2 | ========
3 | ## df
4 | df命令 报告磁盘上文件系统的挂载情况。
5 | >>df为disk和filesystem之意
6 |
7 | 输出结果比如:
8 |
9 | 文件系统 1K-blocks 已用 可用 已用% 挂载点
10 | /dev/sda8 38826448 6610444 30220692 18% /
11 | none 4 0 4 0% /sys/fs/cgroup
12 | udev 4042472 4 4042468 1% /dev
13 | tmpfs 817248 1164 816084 1% /run
14 | none 5120 0 5120 0% /run/lock
15 | none 4086228 152 4086076 1% /run/shm
16 | none 102400 52 102348 1% /run/user
17 | /dev/sda7 274407 93785 161934 37% /boot
18 | /dev/sda9 78689200 4145188 70523788 6% /home
19 |
20 | ## dumpe2fs
21 | 显示 ext2/ext3/ext4 文件系统的信息
22 |
23 | ### dumpe2fs /dev/sda8
24 |
25 |
--------------------------------------------------------------------------------
/Tips.md:
--------------------------------------------------------------------------------
1 | 各种Tip
2 | =======
3 | 接下来介绍下在Linux系统装完之后,要掌握的基本概念,常用命令及操作
4 | ---------
5 | ## root
6 | root是Linux下最高权限的用户,类似Windows下的管理员administer。
7 | ### 切换到root
8 |
9 | su
10 | 然后输入密码即可切换到root用户
11 | >注意
12 | >>在Ubuntu系统刚被装上之后,有时候默认情况下root账户是被锁定的,即使你`su`,并且敲了正确密码,也会提示密码错误。
13 | >>>此时键入`sudo passwd`然后根据提示再重新键入几次密码,root用户的权限就解锁了。该命令也可用于修改root密码。
14 |
15 | ### 退出root
16 | 最快捷的方式就是按组合键 Ctrl+D
17 |
18 | ## Bash相关
19 | ### 上下键
20 | 通过上下键可以翻阅历史命令。而无需重新键入相同命令。
21 | ### Tab键
22 | 在一个命令未输完的时候,按两下Tab键会出现命令补全提示。
23 | ### Alt+.
24 | `Alt`和`.`组合键可快速调用上一个命令的参数。
25 | 不过如果上一个命令有多个参数,则只能调用最后一个参数。
26 | ### Ctrl相关
27 |
28 | |组合键|描述|
29 | |------|-----
30 | |Ctrl+Z|发送susp信号,暂停当前程序,丢入后台
31 | |Ctrl+C|发送intr信号终止当前程序
32 | |Ctrl+D|发送EOF信号
33 | |Ctrl+L|清屏
34 | |Ctrl+H|erase信号,删除光标前一个字符
35 | |Ctrl+W|werase信号,删除光标前一个单词
36 | |Ctrl+U|kill信号,删除光标前该行所有内容
37 | |Ctrl+X|在行首和行尾之间切换光标
38 | |Ctrl+R|搜索历史命令
39 | |Ctrl+S|发送stop信号,暂停屏幕输出
40 | |Ctrl+Q|发送start信号,恢复屏幕输出
41 | >所有的Ctrl键都可以通过键入^字符来代替。
42 | >Ctrl+Z可以使用【fg命令】恢复到当前终端允许,或者使用【bg命令】让其脱离终端在后台运行
43 | >Ctrl+S只是暂停输出,但并不暂停程序运行
44 |
45 | ## ^
46 | ### 删除
47 | 使用^删除上一个命令多余部分。
48 | ```shell
49 | cp fooo.c test.c
50 | ^o
51 | # 等于cp foo.c test.c
52 | ```
53 | 只会删除掉第一个匹配的字符
54 | ### 替换
55 | 使用^old^new替换上一个命令
56 | ## !
57 | !是用于快捷输入历史命令的
58 | ### !!
59 | !!执行上一个命令
60 | ```shell
61 | apt-get install vsftpd
62 | # 提示没有权限
63 | sudo !!
64 | ```
65 | ### !foo与!?foo
66 | !foo执行以foo开头的命令
67 | !?foo执行包含foo的命令
68 | ```shell
69 | git status
70 |
71 | git add .
72 |
73 | !g
74 |
75 | # 引用倒数第一个g开头的命令,即git add .
76 |
77 | !?sta
78 |
79 | # 引用倒数第一个包含sta的命令,即git status
80 | ```
81 | ### !n
82 | 使用!n执行第n个命令。
83 | n可以是负数,即倒数第几个命令
84 | ### `!# `
85 | 单独的`!# `是引用当前行。
86 | !# :n 引用当前行的第n个参数。
87 | ### !:
88 | 引用上一个命令的参数。参数索引从0算起。
89 | ```shell
90 | # 引用上一个命令的第0个参数(实际上是引用命令)
91 | !:0
92 | # 引用上一个命令的第2个参数
93 | [root@localhost ~]# mv test Test
94 | [root@localhost ~]# echo !:2
95 | echo Test ( 命令回显)
96 | Test
97 | # 引用上一个命令的第1到3个参数
98 | !:1-3
99 | # 引用上一个命令的第2个参数开始的所有参数
100 | !:2*
101 | # 引用上一个命令的所有参数
102 | !*
103 | ```
104 | ### !^和!$
105 | ```shell
106 | # 引用上一个命令的第一个参数
107 | [root@localhost ~]# mv Test/ test/
108 | [root@localhost ~]# echo !^
109 | echo Test/
110 | Test/
111 | # 引用上一个命令的最后一个参数
112 | [root@localhost ~]# mv Test/ test/
113 | [root@localhost ~]# echo !$
114 | echo test/
115 | test/
116 | ```
117 | ### :选取
118 | 需要配合历史命令,一起工作。比如`!$:r`
119 | * :h,选取路径的开头,相当于dirname
120 | * :t,选取路径的结尾,相当于basename
121 | * :r,选取文件名,即不包含后缀
122 | * :e,选取文件的后缀名
123 | * :p,打印
124 | * :s,替换,比如`!:s/ti/it`。(更简便的写法:^ti/it)
125 | * :gs,全局替换,不加g的话,只替换第一个匹配
126 | * :u,变成大写。比如`!$:u`
127 | * :l,变成小写。比如`!$:l`
128 |
129 |
130 | ## 授人以渔
131 | 高手是善于寻找帮助的人
132 | ### man
133 | 如果你对某个命令的用法不熟悉,可以使用`man`命令来查看。如
134 |
135 | man ls
136 | 可以查看`ls`命令的用法。
137 | ### info
138 | man是Unix系统的产物,而Linux也提供了自己的解决方案 info。
139 | info中带星号的行,按回车可以跳进新的页面,按shift+u返回。
140 | >原先info要优秀与man,但近代以来差异已经不大。info逐渐没落,极少更新。
141 | 建议使用man
142 |
143 | ### tldp.org
144 | The Linux Document Project
145 | 一个Howto网站。
146 | ### doc
147 | 查看 `/usr/share/doc/`
148 | ### 百度谷歌
149 | 内事不决问百度,外事不决问谷歌
150 | 如果找不到中文资料,那么要去谷歌找英文资料,谷歌比百度要强大丰富的多。
151 | 不过需要搜索英文。
152 |
153 |
154 |
--------------------------------------------------------------------------------
/Yum.md:
--------------------------------------------------------------------------------
1 | RedHat系列软件包管理器Yum
2 | ======
3 | 功能同Ubuntu的APT。命令格式为yum+选项 [参数]
4 | ## 安装
5 | yum install 软件名
6 |
7 | 支持*。
8 | ## 列出已安装或可用软件包
9 | yum list
10 | ## 查看yum软件源
11 | yum repolist all
12 |
13 | 软件源即repository server(仓库服务器)。在`/etc/yum.repos.d/`下面
14 | ## 搜索软件、命令所在的软件包
15 | yum search 名称
16 | ## 生成缓存
17 | yum clean
18 | yum makecache
19 | 每次修改了yum源之后可以调用,这两个命令生成新的缓存
20 |
--------------------------------------------------------------------------------
/adb.md:
--------------------------------------------------------------------------------
1 | android调试工具adb
2 | =====
3 | adb是跨平台的,各种平台都有。因为Linux上缺乏GUI的android手机管理工具,所以adb的使用变得尤为重要
4 | -----
5 | ## 查看设备
6 |
7 | adb devices
8 | 该命令可以查看连接到PC上的android手机。
9 | ## 重启设备
10 |
11 | adb reboot
12 |
13 | ## 安装与卸载软件
14 | ### 安装apk
15 |
16 | adb install abc.apk
17 | 在开启了usb调试的android手机连接以后,可以用此命令将PC上的abc.apk发送到手机端并安装。
18 | ### 重修安装apk
19 |
20 | adb install -r abc.apk
21 |
22 | ### 卸载软件
23 | 卸载软件,需要知道软件的`包名`,比如:
24 |
25 | adb uninstall com.sina.weibo
26 | ## 手机和PC传送文件
27 | ### push
28 |
29 | adb push [原路径] [目标路径]
30 | * 原路径为PC中的文件路径
31 | * 目标路径为手机中的目录(注意权限)
32 | * 目标路径为目录末尾要加`/`
33 |
34 | ### pull
35 | 与push的两个路径正好相反。但其他用法相同。
36 |
--------------------------------------------------------------------------------
/awk.md:
--------------------------------------------------------------------------------
1 | awk
2 | ===
3 | ## 基本格式
4 | |命令 |描述
5 | |------- |------
6 | |awk '{ print $0 }' /etc/passwd |打印整行
7 | |awk -F: '{ print $1 }' /etc/passwd |打印每行分号;分割的第一个字段
8 | |awk -F: '{ print $1 $6 }' /etc/passwd |打印每行第1和6个字段
9 |
10 |
--------------------------------------------------------------------------------
/bash/README.md:
--------------------------------------------------------------------------------
1 | Bash内嵌命令
2 | ============
3 | 本目录下存放的是Bash的内嵌命令。
4 | 可以使用type命令来检测一个命令是否为Bash内嵌。
5 |
--------------------------------------------------------------------------------
/bash/fc.md:
--------------------------------------------------------------------------------
1 | fc
2 | ===
3 | fix command
4 | -----------
5 | 常用于修改错误的命令输入。
6 | ## l
7 | fc -l查看最近的历史记录。显示结果如:
8 |
9 | 1984 ls
10 | 1985 cd GitHub/
11 | 1986 ls
12 | 1987 cd ShiYan/
13 | 1988 ls
14 | 1989 git status
15 | 1990 git commit -am'shiyan3'
16 | 1991 git status
17 | 1992 git push
18 | 1993 clsa
19 | 1994 cls
20 | 1995 cd ..
21 | 1996 cd Notes/
22 | 1997 cd .git/
23 | 1998 vi config
24 | 1999 cd
25 | 左边的数字为事件编号
26 | ## s
27 | s选项不加参数,则继续执行上一个命令。(另外bash支持csh的!!,可完成同样功能)
28 | s选项后面跟上事件编号,则执行该编号对应的命令。
29 | s选项可替换上一条命令的部分字符
30 |
31 | git stutas
32 | fc -s uta=atu
33 |
34 |
--------------------------------------------------------------------------------
/bc.md:
--------------------------------------------------------------------------------
1 | Binary Calculator
2 | =================
3 | Linux下高精度计算器bc学习记录
4 | -----------------
5 | ## 开始
6 | 在终端键入`bc`即可打开bc计算器。打开之后可以输入任意数学表达式来进行计算:
7 |
8 | (1+2)*2^2
9 | 打印计算结果:12
10 | ## 退出
11 | 键入quit即可退出bc。也可以使用组合键Ctrl+D来退出。
12 | ## 常用运算符
13 | |运算符|功能|运算符|功能
14 | |------|----|------|----
15 | |+|加|/|除
16 | |-|减|^|求指数
17 | |_*_|乘|%|求余数
18 | ### 除法
19 | 默认是整型除法。
20 | 如果进行浮点型除法,需要指定精度:
21 |
22 | scale=3
23 | 3/2
24 | 1.500
25 | ## 进制转换
26 | 输入进制**ibase**,输出进制**obase**。默认都是十进制。
27 | 貌似必须要先指定obase,再指定ibase才能生效。
28 |
29 | obase=10
30 | ibase=16
31 | A
32 | 10
33 |
34 | >十六进制的字母要大写表示。
35 |
--------------------------------------------------------------------------------
/crontab.md:
--------------------------------------------------------------------------------
1 | crontab计划任务
2 | ============
3 | ## 安装启动
4 | CentOS下:
5 |
6 | yum install vixie-cron
7 | yum install crontabs
8 | 安装前者一般会同样安装上后者。
9 |
10 | service crond start
11 | 要启动该服务才行。
12 | ## 系统级crontab
13 | 用ls /etc/cron然后敲两下TAB,可以看到相关文件及目录。
14 |
15 | cron.d/ cron.daily/ cron.hourly/ cron.monthly/ crontab cron.weekly/
16 | ### 文件及目录解读
17 | 我们可以编辑crontab文件,来创建计划任务。
18 | 而以daily,hourly,weekly,monthly后缀的目录下分别存放每天,每月,每周,每月执行的任务。
19 | 其中存放的就是Shell脚本文件。权限755。
20 | 而不规则周期的计划任务放在corn.d目录下面。可以看做是crontab文件的补充。
21 | ### crontab文件格式
22 | 该文件开头包含必要的环境变量,不再介绍。
23 | 具体写法直接看源文件注释:
24 | ```
25 | .---------------- minute (0 - 59)
26 | | .------------- hour (0 - 23)
27 | | | .---------- day of month (1 - 31)
28 | | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
29 | | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
30 | | | | | |
31 | * * * * * user-name command to be executed
32 | ```
33 | 一共七个字段,其含义一目了然。需要注意的是每个字段的写法。
34 | * `*`表示每一个。比如minute字段下的`*`表示每一分钟执行
35 | * `*/n`表示每隔n。比如hour字段下,`*/2`表示每隔两小时执行。0-10/2表示1,3,5,7,9
36 | * `1-5`这种格式表示一共连续的时间段
37 | * `1,3,5`这种格式是枚举几个不连续的时间段
38 |
39 | >注意:第三个字段‘天’和第五个字段‘星期几’是或的关系。所以不会冲突,符合两种情况都执行。
40 | 该文件中如果出现%要进行转义,比如date +%w 在该文件内编写的时候要写成date +\%w
41 | 把分钟设置成`*`要慎重
42 |
43 | ## crontab命令(用户级)
44 | ### 命令选项
45 | crontab [-u user] file
46 | crontab [-u user] [-e|-l|-r]
47 |
48 | |选项|描述|
49 | |----|:----:|
50 | |e|编辑计划任务|
51 | |l|列出计划任务|
52 | |r|删除计划任务|
53 | |i|删除之前确认|
54 | |u|指明所属用户|
55 | |s|selinux context|
56 | s选项不常用。
57 | >实际上该命令编辑的是`/var/spool/cron/用户名`文件。
58 | 所以你也可以直接编辑该文件。
59 | 守护进程crond每分钟会读取该文件一次。
60 |
61 | ### 编写格式。
62 | 格式与前文中crontab文件的编写格式相仿,但是没有用户user-name字段。
63 | 因为该命令只能编写当前用户的计划任务。
64 | ## 日志
65 | 在`/var/log/cron`下面可以看到全部日志。
66 | 而`/var/spool/cron/`在下面也可以看到一定的日志。
67 |
--------------------------------------------------------------------------------
/fdisk.md:
--------------------------------------------------------------------------------
1 | fdisk
2 | ====
3 | ## 基本用法
4 | 确切说来,fdisk是一个工具。用法是:
5 |
6 | fdisk [选项] /dev/设备名
7 | 然后会进入一个交互式界面,之后需要用一些操作命令来管理硬盘。
8 | >具体的操作命令不需要记。按**m**会显示提示菜单。
9 |
10 | ## 选项
11 | ...不常用
12 | ## 常用操作命令
13 | |命令|英文释义|描述
14 | |:---:|:-----:|----|
15 | |m|menu|显示提示菜单,每个命令所对应的操作
16 | |n|new|新建一个分区,然后需要用p(primary)和e(extend)来创建主分区或扩展分区
17 | |d|delete|删除一个分区
18 | |p|print|打印当前的硬盘分区情况
19 | |w|write|将改动写入磁盘
20 | |q|quit|退出,不保存改动
21 | |l|list|列出可供使用的分区系统类型
22 | |t|type|改变一个分区的文件系统类型
23 |
--------------------------------------------------------------------------------
/find.md:
--------------------------------------------------------------------------------
1 | find
2 | ====
3 | 常用查找文件的命令。
4 | 以下选项都要以-开头
5 | ## 基本格式
6 | find 路径 -选项 参数 ...
7 | ## 选项
8 | |名称|描述|
9 | |----|-----
10 | |name|按名称查找
11 | |iname|同上,但不区分大小写
12 | |type|文件类型
13 | |perm|权限,其参数为数字
14 | |user|查找属于特定用户
15 | |group|查找属于特定组
16 | |size|查找特定大小
17 | |empty|查找空文件
18 | |amin [-+]n|n分钟前访问
19 | |anewer file|file文件之后访问
20 | |atime [-+]n|n天前访问
21 | |cmin [-+]n|n分钟之前状态改变
22 | |cnewer file|在file之后状态改变
23 | |ctime [-+]n|n天之前状态改变
24 | |mmin [-+]n|n分钟之前修改
25 | |mtime [-+]n|n天之前修改
26 | |newer file|在file文件之后修改
27 |
28 | ## name/iname
29 | 比如:
30 |
31 | find / -name pattern
32 | find / -iname pattern
33 | /为路径。pattern代指文件名,可以使用模式,但是要放进引号中,模式才能生效。
34 | 同样只支持glob的模式,即`*、?、[]`三个通配符。
35 | iname忽略大小写。
36 | ## type
37 | find / -name pattern -type f
38 |
39 | 搜索指定类型的文件。f表示常规文件。`dbcpl`仍旧表示其他五种文件类型。
40 |
41 |
42 |
--------------------------------------------------------------------------------
/ftp.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guodongxiaren/LinuxTool/3bb74b656e9060176e03ffdd236f6e6c9af46b03/ftp.md
--------------------------------------------------------------------------------
/gcc.md:
--------------------------------------------------------------------------------
1 | gcc编译器学习记录
2 | ================
3 | ||gcc是Linux/Unix上非常强大的C语言编译器。并且如今也支持C++的编译。与VC不同,gcc是完全跨平台的。到目前为止很多工具都使用gcc作为其编译环境,比如`cocos2d-x`,android的`NDK`等等。 学习使用gcc编译器,就是学习它众多的编译参数。就是用连字符`-`连接的参数。
4 | |:----------------:|:--------------------|
5 |
6 | >因为它的参数并不全是单字符的,所以不能使用一个连字符后加多个参数的写法,
7 | 要每个参数前面都要加一个连字符
8 |
9 | ||gcc|g++|vc|
10 | |---|:---:|:---:|:---:|
11 | |main|√|x|x|
12 | |void main|x|x|√|
13 | |int main|√|√|√|
14 |
15 | ### 直接开始
16 | 直接在gcc后面加上要编译的C语言源文件
17 |
18 | gcc hello.c
19 | 这种默认的情况下会生成一个名为`a.out`的可执行文件。
20 | >注意,在Linux系统下,后缀名真的不是很重要的事,甚至没有后缀名都可以。这些都没有关系,比如你写一个shell的脚本,其实加不加后缀都是可以运行的。此时后缀的目的是为了便于用户管理和区分文件而已。By the way,如果你执行`./hello.c`,那么系统会把它也当做shell脚本来运行,根本不管什么后缀。
21 |
22 | ### -o
23 | 最常用的编译选项,用于指定要生成的可执行文件的名称。
24 |
25 | gcc -o hello hello.c
26 |
27 | 需要体会的一点是:gcc对于参数的位置无要求!比如也可以写作
28 |
29 | gcc hello.c -o hello
30 |
31 | 惟一要注意的就是`-o`后面一定要紧跟要生成的可执行文件名。
32 | >编译出的可执行文件,在Windows下就是exe(executive)。但Linux下,后缀名无限制。一般不指定后缀就可以了。
33 |
34 | ### -g
35 | 用于给生成的可执行文件加上调试信息,只有这样才可使用[gdb](./gdb.md)调试。
36 |
37 | gcc -g -o hello hello.c
38 |
39 | 同样参数`-g`的也可写在hello.c后面。
40 |
41 | ### -c
42 | 终止链接器的运行,输出文件为汇编后的目标文件`*.o`
43 |
44 | gcc -c hello.c
45 |
46 | 生成文件为`hello.o`
47 | ### -O2
48 | 对源码进行优化,使编译出的程序,运行效率更高。注意是大写的英语字母`O`,不是阿拉伯数字`0`
49 |
50 | gcc -O2 hello.c -o hello
51 |
52 | `O`是Optimize之意。同样还有`O1`,但是优化效果不如`O2`,缺省是`O0`
53 | ### -D
54 | 给编译的源文件传递一个宏。
55 | ```
56 | gcc a.c -DHELLO -DWORLD=10
57 | ```
58 | 相当于:
59 | ```c
60 | //在a.c中定义了
61 | # define HELLO
62 | # define WORLD 10
63 | ```
64 | ### -E
65 | gcc -E 指示gcc对源代码进行预处理,结果直接输出到终端。
66 | >实际上和命令`cpp 源文件`相同。cpp是c预处理器的意思,而非c++的意思。
67 |
68 | ### -I
69 | 包含自定义头文件的路径
70 | ### -S
71 | 生成汇编代码以.s为后缀。
72 | 默认是**AT&T**汇编语法,加选项**masm=intel**可生成**Intel**语法的汇编。
73 |
74 | gcc -S -masm=intel test.c
75 |
76 | ## 链接
77 |
78 | ### 静态链接库
79 | 静态链接库是后缀名为.a的文件。它有多个后缀为你.o的目标文件组成。
80 |
81 | 使用`-c`参数可以使编译在链接前终止,所以生成的是源文件对应的目标文件。
82 |
83 | gcc -c addvec.c multvec.c
84 | ar rcs libvector.a addvec.o multvec.o
85 | `ar`是archive档案的缩写。上面命令生成了.a的静态库文件,在链接时,要如下:
86 |
87 | gcc -c main2.c
88 | gcc -static -o p2 main2.o ./libvector.a
89 | ### 动态链接库
90 | 后缀名为.so的是动态共享链接库文件,其中的s就是shared共享的意思,如下命令:
91 |
92 | gcc -shared -fPIC -o libvector.so addvec.c multvec.c
93 | gcc -o p2 main2.c ./libvector.so
94 | 完成了生成.so以及链接.so的操作。-fPIC指示生成与位置无关的代码。
95 | ### -l
96 | gcc -o temp temp.c -lm
97 | **-lm**选项,在编译时会进入系统库路径搜索,链接“数学库”。常用的库会自动链接,无需指定。
98 | 系统缺省的库路径为:/lib、/usr/lib、/usr/local/lib、/usr/lib64。
99 | >数学库的文件可能为*libm-2.1.2.so*去掉lib和后面的版本号就只剩下m了。
100 |
101 | ### -L
102 | 如果该库不在系统缺省路径下(比如第三方库,自定义的库),还要使用**-L**选项指定路径。
103 |
104 | -L/home/jelly/mylib
105 | ### -Wl,-rpath
106 | **-L**选项指定的是在编译期间库的搜索路径,然而如果是动态库的话,在运行时加载库,此时只会搜索默认库路径。
107 | 此时需在编译时加上**-Wl,-rpath=**后面指定路径。注意这不是两个选项。
108 | ```
109 | g++ -I ../include -Wl,-rpath=../util/ -lwang -L../util/ client.c -o client
110 | ```
111 | 另外一种方案是修改配置文件:`/etc/ld.so.conf`。然后需要**ldconfig**命令(root)更新。如果无root权限,请使用上一种方案。
112 |
113 | ```
114 | 有时候连接通过,但运行时出错:未定义符号XXX。请查看一下是否正确保护库的路径,如果确认无误,仍有错。
115 |
116 | 可以使用**ldd**命令检查链接的库的绝对路径。
117 |
118 | 有时候自己写的库和系统的库重名就会出现该错误。
119 | ```
120 | ## 使用c99标准编译
121 | 默认的情况下,编译器是以c89的标准编译的。使用c99则:
122 |
123 | gcc -std=c99 hello.c
124 |
125 | ## 包含非系统的头文件
126 | `-I`选项指定头文件的位置。一般和L选项联用。比如:
127 |
128 | gcc mysql_test.c -I /usr/local/include/mysql -L/usr/local/lib -lmysqlclient -o test
129 |
130 | ## -M检查所需的头文件
131 | gcc -M main.c
132 |
133 | 以makefile风格显示源文件的依赖关系。会列出所有包含的所有头文件。会列出标准库的头文件。
134 | 如果不想显示标准库的头文件,请使用**-MM**选项代替**-M**。
135 |
136 | ## 其他
137 | ### -fno-elide-constructors
138 | 适用于g++。C++语言因为各种临时对象的问题,所以编译器通常会自行进行优化,比如**NRV**优化(O0已存在该优化),会减少几次拷贝构造函数的调用过程。如果你想关闭这个优化:
139 |
140 | g++ -fno-elide-constructors hello.cpp
141 |
142 |
--------------------------------------------------------------------------------
/gdb.md:
--------------------------------------------------------------------------------
1 | gdb调试器学习记录
2 | =================
3 | |gdb是Linux/Unix系统上强大的调试器。但同时学习起来也让人十分头疼,没有了VS上直观的按键,取而代之的是大量的命令。为此,只有从点滴学起,慢慢积累|
4 | |:-------------------------------|----------------------
5 |
6 | ## 一进一出
7 | ### 启动gdb
8 |
9 | 直接使用gdb 文件名即可调试。此时,将进入gdb的shell。
10 | ```bash
11 | gdb a.out
12 | ```
13 | >>注意!要调试的文件不是源文件,而是加入了调试信息的可执行文件。
14 |
15 | >>编译源文件时,使用`gcc -g`命令添加调试信息。
16 |
17 | ### 退出gdb
18 |
19 | quit简写为`q`,用以退出gdb调试。
20 | >>gdb中的大部分命令会有简写形式
21 |
22 | ## 开始
23 | ### file
24 | 如果你在gdb命令后没输入要调试的文件名,那么可以在进入了gdb终端后,使用file命令装载要调试的文件。
25 | ### start
26 | 在打开gdb调试后,需要在回车后键入start命令才开始调试。
27 |
28 | 重定向
29 |
30 | start out.txt
31 |
32 | ### run
33 | run简写为`r`。可以中断当前执行的步骤,转而回到程序开始处重新开始调试。
34 |
35 | 重定向
36 |
37 | run out.txt
38 |
39 | ### list
40 | list简写为`l`。用于显示源码。可以直接`list`来打印10行源码。也可以在`list`后面跟上行号。
41 |
42 | list 100
43 | 注意,将打印出95-104行的代码,中间那一行就是第100行。
44 | ## 下一步
45 | ### next
46 | next简写为`n`。执行下一步,`next`不会进入调用的函数内部,类似VS中的F10。
47 |
48 | ### step
49 | step简写为`s`。执行下一步,但是`step`会进入调用的函数内部,类似VS中的F11。
50 |
51 | finish命令用于跳出该函数内部,否则`s`命令恐怕就会进入`printf`内部。
52 | ### continue
53 | continue简写为`c`,执行直到遇到断点才中断,类似VS里面F5
54 |
55 | >在VS中:
56 | >>F5直到遇到断点才中断
57 | >>>F10单步执行,遇到子函数调用不进入
58 | >>>>F11单步执行,遇到子函数调用会进入
59 |
60 | ## 打印信息
61 | ### info
62 | info简写为`i`,用以查看局部变量的值。写作:
63 |
64 | info locals
65 |
66 | ### print
67 | print简写为`p`,用以查看单个变量的值。比如我们在执行了
68 | ```c
69 | scanf("%d",n);
70 | ```
71 | 并且键入了n的值之后,可以使用
72 |
73 | print n
74 |
75 | 来查看此时n的值
76 | ### disp
77 | disp命令可以在每步执行后都自动打印变量的值。
78 |
79 | disp i
80 | 要自动打印多个值,需要多条disp命令:
81 |
82 | disp a
83 | disp b
84 | 其打印效果可能如:
85 |
86 | 3: b = 3
87 | 2: a = 2
88 | 与之相对的一个命令就是undisp,用于取消自动打印的变量。
89 |
90 | undisp
91 | 可以取消所有自动打印的变量。
92 |
93 | undisp 3
94 | 可以取消自动打印变量`b`。
95 | >之所以参数是`3`,请查看上面`disp`的打印结果。
96 |
97 | ## 栈帧
98 | 在C语言中每一次函数调用都会开启一个新的栈帧。正是因为有不同的栈帧的存在,我们才可以在两个函数中定义出重名的变量。
99 | ### backtrace
100 | backtrace,简写为`bt`。其打印结果可能如:
101 |
102 | # 0 add (a=2, b=3) at test.c:5
103 | # 1 0x0000000000400525 in main () at test.c:11
104 | 在main函数中调用了一个add函数,查看栈帧可以看到传入add函数的参数。上面的结果显示main函数在1号栈帧,add函数为0号栈帧。
105 | ### frame
106 | frame简写为`f`,可以用来转移栈帧。
107 |
108 | frame 1
109 | 转移到main函数的栈帧中,只有这样我们才能查看main函数中的变量。
110 |
111 | ## 断点
112 | ### break
113 | break简写为`b`,用于加断点,类似VS里面F9
114 |
115 | 要在第71行加一断点
116 |
117 | break 71
118 | 用来查看断点,可简写为`i b`
119 |
120 | info break
121 | 打印结果如:
122 | ```
123 | (gdb) i b
124 | Num Type Disp Enb Address What
125 | 2 breakpoint keep y 0x0000000000401334 in main() at 2225.cpp:71
126 | 5 breakpoint keep y 0x0000000000401345 in main() at 2225.cpp:72
127 | ```
128 |
129 | delete 2
130 | 删除第71行的断点
131 | >delte后面跟的是断点的id,而不是行号
132 |
133 | continue命令简写为`c`,执行程序,直到遇到断点才中断。
134 | ## set
135 | set可以在调试过程中设置变量的值。
136 | 特别值得一提的是,如果用gdb调试main的参数需要在一开始这么写:
137 |
138 | set args 参数...
139 | 然后再执行start语句开始调试。
140 | 程序名(*argv[1]*)无需设置到set args里面
141 |
--------------------------------------------------------------------------------
/git.md:
--------------------------------------------------------------------------------
1 | Today I can use git in Linux.
2 | ================
3 | ||抛弃GUI,在Linux下,使用命令行才是王道。
4 | |-----|:--------|
5 |
6 | 2014/04/30
7 | ==========
8 | 深入理解了几个git命令,入门级命令。
9 | ---
10 | ### ssh
11 | ```bash
12 | ssh-keygen -t rsa -C "your@email.com"
13 | ```
14 | * -t Type 指的是加密算法的类型,后面跟得是rsa
15 | * -C comment 注释,一般是使用你的邮箱地址
16 |
17 | ### config
18 |
19 | git config --global user.name "用户名"
20 | git config --global user.email "邮箱"
21 | git config --global core.quotepath false
22 |
23 | ### git add or rm
24 | git add (filename)
25 | git rm (filename)
26 |
27 | 分别对应添加和删除文件.(filaname)为对应的文件名称。也可以使用
28 |
29 | git add .
30 |
31 | 添加全部修改或新增的文件
32 | ### commit
33 | ```bash
34 | git commit -m "the first commit"
35 | ```
36 | 提交文件,后面的字符串就是commit的标题
37 | 单引号,双引号都可以
38 | ### 修改默认编辑器
39 | linux中直接使用`git commit`会出现nano。nano写commit的提示信息很不方便。貌似一定要要保存个文件名什么的,用着也不如vim顺手。
40 | 设置
41 |
42 | git config --global core.editor vim
43 |
44 | ### git总结(来自网络)
45 | >如果你在与Git的默认设置背道而驰,先问问为什么。
46 | >将公共分支历史看做不可变的、原子性的、容易追溯的。将私有分支历史看做一次性的、可编辑的。
47 | >推荐的工作流程是:
48 | - 基于公共分支创建一个私有分支。
49 | - 经常向这个私有分支commit代码。
50 | - 一旦你的代码完善了,就清理掉私有分支的历史。
51 | - 将干净的私有分支merge到公共分支中。
52 |
53 | 2014/05/01
54 | =====
55 | 今天好多的第一次吧。其实学习本身就是一个个第一次的过程。今天主要是关于Git的学习了吧。
56 | -----
57 | ### 分支
58 | |操作|详细命令|
59 | |:----:|:-----:|
60 | |新建分支|`git branch testing`|
61 | |切换分支|`git checkout testing`|
62 | |删除分支|`git branch -d testing`|
63 | |查看分支|`git branch`|
64 |
65 | ### stash
66 | 我今天遇到的一个状况就是:我是在网站上新建的分支alpha,然后本地的代码又进行了改动,本来想把改动都push进alpha的。结果在本地是无法checkout的。因为本地还没有这个分支,这时候git stash就派上用场了。
67 | - git stash
68 | - git pull
69 | - git checkout alpha
70 | - git stash apply
71 | - git push
72 |
73 | 2014/05/27
74 | =========
75 | 在git中添加文件的命令很简单`git add .`,但对于删除文件,一直有误解。今天算是搞清楚了git移除文件的命令奥义
76 | ---------
77 |
78 | git rm 文件名
79 |
80 | 与`git add`不同。git add 并不会新建文件,只是把已经新建了的文件提交到本地仓库。但是git rm真的会删除文件。比如git rm a.c。如果a.c是已删除文件的话,那么就会提交到本地仓库,如果是未删除文件的话,就会给删除掉。
81 | >注意!可以这样被删除的只能是已经add过的文件,未在本地仓库记录的文件是无法删除的,要删除还是使用`rm`吧。
82 |
83 | 2014/05/30
84 | ===========
85 | 分支的小盲点
86 | ------------
87 | ### 提交新分支
88 | 今天为操作系统实验,新建了个文件夹。又新建了个os分支用于在本地编辑实验文件。然后学到了提交本地新建分支到服务器。
在本地新建分支很容易
89 |
90 | git branch 【分支名】
91 | 但是如何把分支提交到github呢?
92 | 开始我以为直接`git push`就行了,却发现不行。真正的做法是:
93 |
94 | git push origin 【分支名】
95 |
96 | ### 新建并切换到新分支
97 |
98 | git checkout -b 【新分支名】
99 |
100 | >原来误以为这个操作是`git branch -b 【新分支名】`,囧。。
101 |
102 |
103 | 2014/05/31
104 | ==========
105 | 把远端其他分支clone到本地
106 | -----------------------
107 | 通常我们clone一个远端的仓库,只能克隆到它的`master`分支。然而如果有其他分支呢?比如github的`gh-pages`分支。
108 |
我们可以这样:
109 |
110 | git branch gh-pages origin/gh-pages
111 |
112 | 很简单吧。以此类推,我们还能想出其他的解决方案。
113 |
114 | git branch gh-pages
115 | git checkout gh-pages origin/gh-pages
116 | 或者
117 |
118 | git checkout -b gh-pages origin/gh-pages
119 |
120 | >注意,本地的那个分支并不一定要求和远端相联的分支名称相同。并且本地的分支并不一定要`推`到远端,远端分支也并不一定需要`拉`到本地。
121 |
122 |
123 | 2014/06/04
124 | ==========
125 | 删除已提交到本地仓库的文件
126 | ------
127 | 我在本地新建了一个文件a.c,并使用`git add a.c`添加到本地暂存区,我现在想撤销它。
128 |
129 | git rm --cache a.c
130 |
131 | 2014/06/06
132 | ==========
133 | 今天发了一个一直以来的误解吧:`git pull`和`git push`是针对所有分支进行的操作。也就是说即使我切换到一个次分支`alpha`,
134 | 如果这个分支和远端的分支已关联了的话,那么执行`git pull`会把`master`分支和`alpha`分支都更新到远端。
135 | 单独提交某个分支的方法,其实我前面的学习日志里已经写过了,汗颜。。。
136 |
137 | git push origin alpha
138 | >`git pull`也是同样的道理。
139 |
140 | 2014/06/15
141 | ==========
142 | ## 移动文件
143 | 原先我移动文件到另一个文件夹总是使用shell的命令。
144 |
145 | mv a.txt Book/
146 | 这样有个问题就是接下来我要做两次track操作
147 |
148 | git add .
149 | git rm a.txt
150 | 但是,其实有个更简洁的操作,就是git的移动操作
151 |
152 | git mv a.txt Book/
153 | 不仅移动了文件的位置,而且自动track了这个变动。
154 | ## git add新学习
155 |
156 | git add -u
157 | 可以自动track删除掉的文件
158 |
159 | git add -A
160 | 可以自动track删除掉和新增的文件
161 |
162 | 2014/06/22
163 | ==========
164 | ## git init
165 | 原先一直是clone项目的。但是也可以把本地项目变作git项目。只需要
166 |
167 | git init
168 | ## git remote
169 | 但是还有和远端建立连接
170 |
171 | git remote add origin https://code.csdn.net/guodongxiaren/test.git
172 | 比如这样。origin这个远端名可以随便取,也可以删除掉它。
173 |
174 | git remote rm origin
175 | 这样以后,如果pull的时候需要完整的路径。
176 |
177 | git pull origin master
178 | 不能只写`git pull`了。
179 |
180 | 2014/06/24
181 | ==========
182 | 今天学到了使fork来的库与原ower的库保持更新的方法。因为我fork了一个vim配置文件的库,
183 | 原持有者修复了一些bug,我需要把他的更新也同步到我的这个库里面。
184 |
185 | >其实没有用到新的知识,都是已经掌握的。主要是学到了一个经验。
186 |
187 | 1. 增加一个远端
188 | ```
189 | git remote add ma6174 https://github.com/ma6174/vim.git
190 | ```
191 | 远端名任意。
192 |
193 | 2. 开始更新
194 | ```
195 | git fetch ma6174
196 | ```
197 | 3. 合并
198 | ```
199 | git merge ma6174/master
200 | ```
201 | 或者直接`git pull ma6174 master`
202 |
203 | 再`git push ncu master`
204 | >其中ncu是添加的另一个远端
205 |
206 | 2014/07/04
207 | ==========
208 | ## git commit -a
209 | commit的`a`选项,只能捕获修改和删除的文件。
210 |
211 | 2014/07/08
212 | ==========
213 | ## 对于git add .的再理解
214 | git add .只能添加当前目录及其子目录下新增或修改的文件,
215 | 不能添加兄弟目录下的文件。
216 |
217 | 2014/07/12
218 | ==========
219 | ## git add -A
220 | 这个命令一定要加路径才行。要添加该目录树下所有新文件
221 |
222 | git add -A :/
223 |
224 | 2014/07/23
225 | ==========
226 | ## 克隆远端repository的时候,可以在后面加一个参数。如
227 |
228 | git clone git@github.com:abc/hello.git hehe
229 | 这样这个repo的所在的文件夹名称就变为了hehe,而不是默认的hello了。
230 | ## 删除远端的分支
231 |
232 | git push origin --delete <分支名>
233 | 注意空格。即使是在子目录中也能添加整个目录树的文件。
234 | 2014/08/11
235 | ==========
236 | ## 设置默认追踪分支
237 |
238 | git branch --set-upstream-to=origin/ master
239 | 这样就可以直接`git pull`了,而不用指定远端和分支。
240 | ## git协议的误区
241 | 使用SSH协议可以避免每次`push`输入密码。前提是在账户里配置好SSH秘钥。
242 | git@github.com开头的就是SSH协议。
243 | 使用Https协议则会导致每次都会输入用户名和密码。
244 | 2014/08/31
245 | ==========
246 | git config --global credential.helper store
247 | https协议记住密码的命令。
248 | 2014/09/14
249 | ==========
250 | ## 查询man手册
251 | 查看man手册的git命令时,比如查询git diff要使用man git-diff。
252 | ## git ls-files
253 | 可以显示在Git管理范围内的文件。
254 | ## git diff
255 | 比较差别。但是只能显示已经在Git范围内的文件,新建而未添加的文件不显示差别。
256 | *注意*,git diff显示的是“缓存区”(staging area)和工作区之间的差别。
257 | 也就是说,当我把改动的文件add之后,缓存区与工作区就一致了,使用git diff就会没有反应。
258 | #### git diff HEAD
259 | 用以显示最新提交(commit)和当前工作区的差别。包括已更改但尚未add的改动。
260 | #### git diff --cached
261 | 用以显示最新提交和缓存区的差别。包括已add但尚未commit的改动。
262 | 2014/10/11
263 | ==========
264 | ## 撤销暂存的文件
265 | 暂存,就是已经add但未commit的文件。
266 |
267 | git reset HEAD
268 | 恢复所有add文件为未暂存的状态。
269 | 也可以使用上面语句加上单个文件名,来恢复单个文件。
270 | ## 撤销commit的文件
271 | 先用git log查看每个版本的hash值
272 | 使用下面语句恢复到特定版本
273 |
274 | git reset --hard hash值
275 | hash值也可以用HEAD代替。
276 | HEAD^代表上一次commit前的版本。
277 | 注意,这时已经暂存但未commit的文件,将消失。在上次版本之后出现的文件,也将消失。
278 | HEAD^^代表上上次commit前的版本,以此类推。
279 | ## 删除所有未被跟踪的文件
280 | git clean -df
281 |
282 | 2014/10/24
283 | =====
284 | Git2.0版本,git add命令有了改动。使用如下命令进行设置:
285 |
286 | git add --all
287 | 这样,以后被rm,mv操作的文件,再使用了git add .之后也能提交到暂存区了。
288 |
289 | 2014/10/28
290 | ===========
291 | 补充上次commit
292 |
293 | git commit --amend
294 | 把文件添加到缓存区后,再执行上述命令。可以补充到上一次的commit。
295 | 2014/11/01
296 | =========
297 | 一个错误的解决方案:
298 | 今天在CentOS上,git push的时候遇到一个问题:
299 |
300 | error: The requested URL returned error: 403 Forbidden while accessing https://....
301 | 我的remote地址使用的https协议。百度到的解决方案是:
302 | 把config文件中的url改为https://用户名@github.com/... 的形式。然后再push的时候就会直接提示输入密码。
303 |
304 | 2014/11/08
305 | ==========
306 | 设置本地分支默认跟踪的远程分支
307 |
308 | git branch --set-upstream-to=origin/django django
309 | origin后面的django指的是远程分支,最后一个参数django是本地分支。
310 |
311 | 2014/11/17
312 | ==========
313 | 不再跟踪某一文件。
314 |
315 | git rm [-r] --cached .classpath
316 | .classpath为文件名
317 | 2014/12/29
318 | ===========
319 | ## 丢弃工作区改动
320 | 如果你的工作区发生了改动,还没暂存的话,
321 | 那么用`git status`查看,改动的文件会是红色的。此时如果执行`git pull`,
322 | 则会出现问题,提示你要暂存改动,如果你不想暂存,想用云端的文件覆盖掉本地的文件,
323 | 则需要丢弃工作区改动:
324 |
325 | git checkout 要丢弃改动的文件名
326 | git checkout ddl.sql
327 |
328 | ## 把本地分支同步到remote
329 | git push -u origin test
330 | 上面命令将当前本地分支,推送到远端的test分支,并建立关联。
331 | 远端若无test分支,则会自动创建
332 | 2015/03/05
333 | ==========
334 | 源码编译git。遇到了一些问题,主要是依赖没安装完整(也能编译成功,但是缺少功能)。
335 |
336 | 要安装的依赖是:
337 | - zlib
338 | - openssl(--shared和-fPIC选项)
339 | - libcurl(--with-ssl)
340 | - expat
341 | - ascilldoc
342 |
343 | 把这些源码下载下来编译好,就行了。
344 | 要注意的是openssl要先于libcurl编译,因为libcurl在configure阶段需要开启`--with-ssl`选项来指明openssl的路径,否则就无法支持很好地https协议(git pull失败)。
345 |
346 | 另外openssl的configure阶段要使用`--shared -fPIC`选项使编译生成动态库(`.so`,默认是静态库`.a`),这样才能被libcurl调用。如果之前已经生成过静态库了,重新编译之前要`sudo make clean`一下。
347 |
348 | 2015/06/25
349 | ==========
350 | 修改终端中git中文的显示方式:
351 |
352 | git config --global core.quotepath false
353 | 这样就不会对`0x80`以上的字符进行quote。能正常显示中文。
354 |
355 | 2015/11/19
356 | ==========
357 | 修改默认push/pull规则。默认有两个规则:
358 | - Matching: 推送当前所有分支到remote
359 | - Simple: 只推送当前分支到remote
360 |
361 | 命令如下:
362 | ```
363 | git config --global push.default matching
364 | git config --global push.default simple
365 | ```
366 | 2016/02/25
367 | ===========
368 | 克隆指定分支的文件。
369 | ```
370 | git clone -b 分支名 远端URL
371 | ```
372 |
373 | 2016/03/24
374 | ============
375 | ## 孤儿分支,开启新历史
376 | 如果你想抛弃所有的git历史纪录,你可以创建一个孤儿分支,它不继承自任何父分支。而是重新开启一段git历史记录。
377 | 它不会丢失之前的文件,你只需要重新把它们commit一次。例如:
378 | ```
379 | git checkout --orpha gh-pages
380 | ```
381 | 上述命令创建了一个分支`gh-pages`。
382 | >如果原始分支master是空的,那么gh-pages分支创建后,master分支将消失。如果master不空,那么不消失。
383 |
384 | ## 删除远程分支
385 | 比如你想删除远程master分支。那么:
386 | - 本地删除master分支:`git branch -D master`
387 | - 在github上将其他分支(比如gh-pages)设置为默认分支
388 | - 本地执行`git push -u origin :master`(冒号前空格)
389 |
390 | 注意执行顺序。
391 |
392 | 2018/10/22
393 | ========
394 | ```
395 | git push origin HEAD:refs/for/master
396 | ```
397 | 这个命令会将代码推送到云端,但是不会直接在云端的master分支生效,表示需要经过code review才能生效。
398 | 企业内部为了规范代码的提交,常常使用
399 |
400 | 2019
401 | =======
402 | ## 保持git log的时间线线性!
403 | 在工作中,多人合作开发一个项目的时候,难免存在其他人更新了master代码的情况。这时候如果直接`git pull`则会自动产生一个merge记录,在git log里。通常merge log是不友好的,会给代码回溯,代码review带来一些麻烦。企业内部一般鼓励保持git log时间线的线性,所谓线性就是不含有merge记录。应该在pull代码的时候进行如下操作:
404 | 要使用`git pull --rebase`代替`git pull`,这个操作称之为『变基』。没冲突则自动成功,把你的commit调整到master最后一个commit之后。如果有冲突,此时会出现一个临时分支,并且会自动切到该分支下。像平常一样修改代码解决冲突,然后git add修改的文件,此时不要`git commit --amend`。而是使用`git rebase --continue`。则会回到master分支,并且将时间线调整成线性。
405 |
406 | 如果你已经误操作了`git pull`,并且自动出现了merge记录也有补救措施,就是`git reset --soft`软重置到你commit的时间点。然后重新执行`git pull --rebase`,进行正确的操作,由于是软重置,本地代码改动未丢失,基本上不会再大量改动冲突文件,当然可能也会报冲突,不过打开文件,你会发现:`<<<===`中间是空的,直接删除冲突标记行就可以。
407 |
--------------------------------------------------------------------------------
/grep.md:
--------------------------------------------------------------------------------
1 | grep学习笔记
2 | ============
3 | 原型为ex编辑器中`g/RE/p`:global、Regular Expression、print
4 | ------------
5 | ## 基本格式
6 |
7 | grep word filename filename
8 | 在多个文件中查找word。例如:
9 |
10 | grep echo hello.sh hi.sh
11 | ## 退出状态
12 | |$?|描述|
13 | |:----:|-----|
14 | |0|查找模式成功|
15 | |1|找不到模式|
16 | |2|找不到要搜索的文件|
17 | ## .的和*的谬误
18 | * .代表匹配任意字符,但是只代表一个字符。
19 | * `*`代表匹配前一个字符,但是重复任意次
20 |
21 | `grep ooo* `可以匹配到good。貌似和普通的正则有所不同。
22 | ## 集合[]
23 | 匹配`[]`内的任意字符。
24 | ## 范围{}
25 | `{}`要进行转义。
26 | grep 'a\{2\}' test.txt
27 | 查询出现两次的a的文本。
28 | ## 常用选项
29 | ### -l
30 | 查找文件内容
31 |
32 | grep -l abc file.txt
33 | 查找file.txt文件内容中是否包含abc
34 | ### -n
35 | 打印行号
36 | ### -q
37 | `quiet`,不打印搜索结果到标准输出。
38 | ### -v
39 | **v**,`invert-match`意为反转匹配,即打印不匹配的行。比如:
40 |
41 | grep -v '# ' hello.cpp
42 | 将打印不以`# `开头的行。
43 |
44 |
45 |
--------------------------------------------------------------------------------
/hexdump.md:
--------------------------------------------------------------------------------
1 | hexdump
2 | =======
3 | 十六进制查看器
4 | ## 选项
5 | ### c
6 | hexdump -c
7 | 逐字符显示。
8 | ### C
9 | hexdump -C
10 | 用十六进制查看文件。可以是普通文件或可执行文件。
11 |
--------------------------------------------------------------------------------
/install.md:
--------------------------------------------------------------------------------
1 | install
2 | =======
3 | 经常在`Makefile`中用到的命令。
4 |
5 | 该命令执行文件复制工作,所以要指明原文件和目的文件。文件名可包含路径。
6 | 类似cp,但与cp不同的是该命令可以有许多附加效果。
7 | ## 常用选项
8 | |选项|附加参数|描述
9 | |:---:|----|----
10 | |-m|权限值|修改文件权限,相当于chmod
11 | |-p|无|修改原文件的的mtime(修改时间),相当于touch
12 | |-D|无|创建目的文件路径中所缺的目录文件
13 |
--------------------------------------------------------------------------------
/ipcmk.md:
--------------------------------------------------------------------------------
1 | ipcmk
2 | =====
3 | 创建System V的三类IPC对象
4 | ## 选项
5 | |选项|描述|
6 | |----|-----
7 | |-Q|创建一个消息队列
8 | |-S|创建信号量,后跟一参数指明数量
9 | |-M|创建共享内存,后跟一参数指明大小
10 | ## 其他选项
11 | |短选项|长选项|描述
12 | |----|----|-----
13 | |-p|--mode|指定权限,缺省0664
14 | |-h|--help|帮助信息
15 | |-v|--version|版本信息
16 |
17 | ## 相关命令
18 | |命令|描述
19 | |----|-----
20 | |[ipcs](ipcs.md)|显示(show)IPC对象的信息
21 | |[ipcrm](ipcrm.md)|删除(remove)IPC对象
22 |
23 |
--------------------------------------------------------------------------------
/ipcrm.md:
--------------------------------------------------------------------------------
1 | ipcrm
2 | ======
3 | 删除System V的三种IPC对象(消息队列、信号量、共享内存)
4 | ## 基本用法
5 | 有两种用法:
6 | ```
7 | ipcrm {msg|sem|shm} id ...
8 | ipcrm [选项]
9 | ```
10 | ## 选项
11 | |选项|描述|
12 | |----|-----
13 | |-Q|删除消息队列,以key为参数
14 | |-q|删除消息队列,以id为参数
15 | |-S|删除信号量,以key为参数
16 | |-s|删除信号量,以id为参数
17 | |-M|删除共享内存,以key为参数
18 | |-m|删除共享内存,以id为参数
19 |
20 | ## 相关命令
21 | |命令|描述
22 | |----|-----
23 | |[ipcmk](ipcmk.md)|创建(make)IPC对象
24 | |[ipcs](ipcs.md)|显示(show)IPC对象的信息
25 |
--------------------------------------------------------------------------------
/ipcs.md:
--------------------------------------------------------------------------------
1 | ipcs
2 | ====
3 | 显示IPC对象的信息。
4 | >这里的IPC对象特指System的三类IPC机制(消息队列、信号量、共享内存)产生的对象。
5 |
6 | 下面介绍各类选项
7 | ## 资源选项
8 | |选项|描述
9 | |----|----
10 | |-q|显示活动的消息队列(message queue)的信息
11 | |-s|显示活动的信号量(semphore)的信息
12 | |-m|显示活动的共享内存(shared memory)的信息
13 | |-a|显示所有(all)活动的IPC对象的信息
14 | ## 输出格式选项
15 | |选项|描述
16 | |----|----
17 | |-c|显示创建者(creator)和所有者
18 | |-l|显示资源限制(limits)
19 | |-p|显示pid
20 | |-t|显示时间(time)信息
21 | |-u|显示状态总结(summary)
22 | 当指定了**-l**选项的时候,可以使用以下两个选项改变显示风格
23 |
24 | |短选项|长选项|描述
25 | |----|----|-----
26 | |-b|--bytes|以字节数显示
27 | ||--human|以人类可读的形式显示
28 | ## 其他选项
29 | |短选项|长选项|描述
30 | |----|----|-----
31 | |-i|--id|显示指定id的IPC对象的详细id
32 | |-h|--help|帮助信息
33 | |-v|--version|版本信息
34 |
35 | ## 相关命令
36 | |命令|描述
37 | |----|-----
38 | |[ipcmk](ipcmk.md)|创建(make)IPC对象
39 | |[ipcrm](ipcrm.md)|删除(remove)IPC对象
40 |
41 |
--------------------------------------------------------------------------------
/lsof.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guodongxiaren/LinuxTool/3bb74b656e9060176e03ffdd236f6e6c9af46b03/lsof.md
--------------------------------------------------------------------------------
/make.md:
--------------------------------------------------------------------------------
1 | make命令介绍
2 | =====
3 | ## 选项
4 | ### -i,--ignore-error
5 | 忽略编译过程中的所有错误。不建议使用。
6 | ### -k,--keep-going
7 | 如果某命令出错,则终止该命令,但是编译过程继续向下执行。
8 | ### -n,--just-print
9 | 只打印命令,不执行命令
10 | ### -s,--slient
11 | 全面禁止显示命令
12 |
13 | ## 其他知识
14 | ### 传递参数
15 | 比如`make prefix=/usr/local`,prefix并非是make的选项,这样做的目的是传递了一个参数(变量)`prefix`给了makefile使用。
16 |
--------------------------------------------------------------------------------
/makefile.md:
--------------------------------------------------------------------------------
1 | Makefile
2 | ========
3 | ## 注释
4 | 以`# `开头
5 | ### 基本格式
6 | ```
7 | 目标:条件集合(依赖关系)...
8 | 命令1
9 | 命令2
10 | ```
11 | 命令前面必须有一个Tab,而不是空白符。
12 | 举例:
13 | ```
14 | main:main.o getdata.o calc.o putdata.o
15 | gcc -o main main.o getdata.o calc.o putdata.o
16 | ```
17 | 最终生成的目标文件一定要在第一行被定义。
18 |
19 | ## 伪目标
20 | 定义了目标,但却不会实际生成(比如clean)。它只是一个**标号**,它的命令也不会被make隐式调用,只能显式地调用
21 | (比如make clean)。
22 | ### .PHONY
23 | 因为伪目标可能和真实目标重名,这时用**.PHONY**关键字来指定伪目标,这时无论是否有重名的真目标,该名称都视作伪目标处理。
24 | 即只能显式调用。
25 | 用法如:
26 | ```
27 | .PHONY:clean
28 | clean:
29 | rm *.o
30 | rm main
31 | ```
32 |
33 | ## 变量
34 |
35 | ```
36 | objects = main.o getdata.o calc.o putdata.o
37 | main:$(objects)
38 | gcc -o main $(objects)
39 | ```
40 | ### 各种=
41 | |符号|描述
42 | |----|----
43 | |=|基本赋值
44 | |:=|覆盖之前的值
45 | |?=|如果没有被赋值就赋予等于号后面的值
46 | |+=|给变量添加等于号后面的值
47 |
48 | >:= 类似与C语言中简单的宏替换。比如 a:=$(b) 后面是一个变量的话,
49 | 那么当b值变化的时候,a的值不会发生变化。 = 则不然。
50 |
51 | ```
52 | 请注意,如果:=后面也是以变量的形式给出的,那么后面这个变量一定要在前面已定义。
53 | ```
54 | ### 特殊变量
55 | |变量|描述|
56 | |----|----|
57 | |**$@**|目标文件
58 | |**$^**|所有依赖文件|
59 | |**$<**|第一个依赖文件|
60 | |**$?**|依赖文件列表中被改变过的文件
61 | |VPATH|文件搜索路径
62 | 前4个称为自动化变量
63 | ```
64 | main:main.o getdata.o calc.o putdata.o
65 | gcc -o $@ $^
66 | ```
67 | ## 通配符
68 | 支持Unix常用的三个通配符:`*`,`?`,`[]`
69 | ## 关键字
70 | ### vpath
71 | 在目录中所有指定文件。
72 | `vpath <模式> <目录>`
73 | 比如:
74 | ```
75 | vpath %.h lib
76 | vpath %.h lib2
77 | ```
78 | 可以连续使用该关键字
79 |
80 | ## 命令
81 | 支持所有系统命令(/bin/sh)。
82 | ### ;
83 | 如果要使上一条命令的执行结果作用于下一条命令,请在一行写出这两个命令并用分号;间隔。
84 | 比如:
85 | ```
86 | exec:
87 | cd bin/;rm *
88 | ```
89 | ### @
90 | Make在执行的命令的时候,首先会显示出来要执行的命令,如果给命令加上**@**前缀可使命令不显示。
91 | 比如:
92 | ```
93 | a : a.c
94 | @echo hello
95 | gcc $< -o $@
96 | ```
97 | 此时终端打印:
98 | ```
99 | hello
100 | gcc a.c -o a
101 | ```
102 | 如果不加@,则打印
103 | ```
104 | echo hello
105 | hello
106 | gcc a.c -o a
107 | ```
108 | ### -
109 | 在命令前面加上前缀**-**,表示忽略命令的出错,继续执行。
110 |
111 | ## 函数
112 | 函数调用方式形如变量的引用。格式为:
113 |
114 | $(函数名 参数列表)
115 | ${函数名 参数列表}
116 | 参数的个数,我下面用**元**来表示,多个参数用逗号(*,*)间隔,而非空格。一个参数实际上可以由多个空格间隔的变量组成。
117 | ### filter
118 | 二元函数,举例:
119 |
120 | $(filter %.o,$(files))
121 | 表示在变量files中进行过滤,仅保留模式为%.o的内容。
122 | ### filter-out
123 | 反过滤函数,与filter相反。
124 | ### dir
125 | 一元函数,举例:
126 |
127 | $(dir $@)
128 | 提取文件名中的路径名并返回,如果目录有多层则也提取出多层。如果不包含目录,则返回值为`./`(当前目录)
129 | ### notdir
130 | 与`dir`函数相反,提取出不包含路径名的文件名。
131 | ### addprefix
132 | 二元函数,给指定变量的值增加前缀。举例:
133 |
134 | $(addprefix src/,foo bar)
135 | 返回值是`src/foo src/bar`
136 | ### wildcard
137 | 一元函数,wildcard是通配符的意思,这里的通配符是指星号--*--而非百分号**%**。举例:
138 |
139 | src=$(wildcard *.c ./lib/*.c)
140 | 将当前目录以及lib目录中所有后缀的c的文件名赋值给src
141 | ### patsubst
142 | 三元函数,函数名是`pattern substitue`(模式替换)的意思。格式:
143 |
144 | $(patsubst 模式1,模式2,变量)
145 | 将变量(或常量字符串)中符合模式1的字符串替换成模式2的形式。模式即包含%的模式。
146 | ### sort
147 | 一元函数,给字符串单词按字典升序排序。举例:
148 |
149 | $(sort foo bar lose)
150 | 返回`bar foo lose`。主要sort函数会去掉相同的词。
151 | ### word
152 | 二元函数,取字符串中第几个单词。举例:
153 |
154 | $(word 3,bar foo lose)
155 | 返回`lose`
156 | ### strip
157 | 一元函数,去除字符串首尾空格。
158 | ### foreach
159 | 三元函数,类似其他语言中的foreach循环。格式如:
160 |
161 | $(foreach 迭代子,迭代对象,循环体操作)
162 | 举例:
163 | ```
164 | //以下代码节选自“蘑菇街”IM服务器项目
165 | $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
166 | ```
167 | 可以理解成java的类似语句
168 | ```java
169 | for(d:SRCDIRS){
170 | wildcard(addprefix(d,SRCEXTS));
171 | }
172 | ```
173 |
--------------------------------------------------------------------------------
/mpstat.md:
--------------------------------------------------------------------------------
1 | mpstat
2 | ======
3 | multi-processor statistics。实时监测多处理器上每个CPU的使用情况。
4 | >Linux系统上安装的时候,需要安装的软件包是sysstat。
5 |
6 | ## 命令格式
7 |
8 | mpstat 选项 参数
9 | ## 选项
10 | ### I
11 | ` -I { SUM | CPU | SCPU | ALL }`
12 | 报告中断的信息。
13 | |参数|说明
14 | |----|---
15 | |SUM|报告每个CPU每秒收到的中断总数
16 | |CPU|报告每个CPU每秒收到的每种中断的次数
17 | |SCPU|报告每个CPU每秒收到的每种软中断的次数
18 | |ALL|展示上面的所有信息
19 |
20 | ### P
21 | ` -P { cpu [,...] | ON | ALL }`
22 | 指定要检测的CPU号(0~n-1)。ALL表示检测所有CPU。ON表示只监测在线(在工作)的CPU。
23 | ### u
24 | 报告CPU的状态,其输出信息见下面的命令输出。
25 | ### A
26 | 等价于`-u -I ALL -P ALL`
27 | ## 其他参数
28 | ### interval
29 | 指定采样间隔。
30 | ### count
31 | 指定采样次数
32 | 比如`mpstat 5 2`
33 | ## 命令输出
34 | ```
35 | 时间戳 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
36 | ```
37 |
38 |
--------------------------------------------------------------------------------
/nc.md:
--------------------------------------------------------------------------------
1 | # nc
2 | 号称:网络中的瑞士军刀
3 |
4 |
5 |
6 |
7 | ## 其他用法
8 | 在自动脚本中,向交互式命令行发送命令,并获得输出结果。
9 | 比如,有些服务,有telnet的控制端,可以使用nc来发送命令。
10 | ```sh
11 | echo "help"|nc 127.0.0.1 1234
12 | ```
13 | 等同于 telnet 127.0.0.1 1234 进去输入help命令。
14 |
--------------------------------------------------------------------------------
/netstat.md:
--------------------------------------------------------------------------------
1 | netstat
2 | ======
3 | 它可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等。我们一般使用它的第一个功能,对于后两者功能我们可以采用更强大的`route`和`ifconfig`来查看。
4 | ## 常用选项
5 | |选项|描述
6 | |:--:|---
7 | |-n|使用IP表示主机,而不是主机名;使用数字表示端口,而不是服务名
8 | |-a|显示所有socket,包含监听socket
9 | |-l|仅显示监听socket
10 | |-t|仅显示TCP连接
11 | |-r|显示路由信息
12 | |-i|显示网卡接口的数据流量
13 | |-c|每隔1s输出一次
14 | |-o|显示socket定时器的信息
15 | |-p|显示socket所属进程的PID和名字
16 |
17 | 加不加`-n`所打印的信息数量是一样的,只不过缺省情况下会用主机名(比如域名)来表示主机,如果加了`-n`,则用IP地址表示主机。没有主机名的一律都是IP地址显示。
18 | 另外,缺省的情况下不显示监听socket。
19 |
--------------------------------------------------------------------------------
/pacman.md:
--------------------------------------------------------------------------------
1 | **package manager**
2 | ## S(sync)
3 | 从远端安装软件
4 |
--------------------------------------------------------------------------------
/rpm.md:
--------------------------------------------------------------------------------
1 | rpm
2 | ====
3 | ## 删除软件
4 | ### -e
5 | ### -nodeps
6 | 无视依赖,强制删除
7 | ## 查看系统安装的软件
8 | ### -qa
9 |
--------------------------------------------------------------------------------
/samba.md:
--------------------------------------------------------------------------------
1 | samba服务器
2 | ===========
3 | 基于SMB协议,最初不可路由(只能用于局域网),近年来可以用于互联网,但很少这样用。
4 | >我称之为`桑巴`。
5 |
6 | smb.conf文件
7 | ------------
8 | ubuntu/red hat下都是在`/etc/samba/smb.conf`。
9 | 其他发行版位置可能不同,但都叫做`smb.conf`。
10 | ### 注释
11 | 注释分两种。
12 | `# `开始的行,是samba的描述。`;`开始的行是有效设置行,只是当前不启用,用`;`注释掉。
13 | ### 设置段
14 | |设置段|描述|
15 | |------|------|
16 | |[global]|设置全局环境变量选项|
17 | |[homes]|设置用户宿主目录共享|
18 | |[printers]|设置打印机共享|
19 | |[sharefiles]|设置文件共享|
20 |
21 | #### global
22 | * **workgroup** 指定工作组或域
23 | * **server string** 描述
24 | * **security** 指定安全模式
25 | * **share** 无权限验证
26 | * **user** 缺省,推荐,由Linux Samba服务器验证
27 | * **server** 较少使用。第三方主机验证
28 | * **domain** 较少使用。第三方主机验证(第三方必须是Windows的域控制器)
29 | * **hosts allow** 限定主机访问
30 | * **log file** 指定日志文件存放位置
31 | * **max log size** 指定日志文件大小
32 |
33 | hosts allow 只需指定网段,不需要主机名。
34 |
35 | hosts allow = 127. 192.168.12. 192.168.13.
36 |
37 | smbclient
38 | ---------
39 | smbclient //192.168.1.107/share -U jelly
40 | 上面IP是局域网内的Windows主机的地址。share是该主机上的共享文件夹。jelly是该主机上的用户。
41 | 命令成功后,将出现一个smb命令提示符的界面。可以用help查看支持的命令。
42 | 在这里没我们可以进行创建文件等等操作,所有所做都作用在share文件夹中。
43 |
44 | smbpasswd
45 | ---------
46 | |选项|描述|
47 | |-----|----|
48 | |a|添加用户到smbpasswd文件
49 | |x|删除用户
50 |
--------------------------------------------------------------------------------
/scp.md:
--------------------------------------------------------------------------------
1 | scp
2 | ====
3 | 两个主机间的文件复制命令,不同于rsync,scp是全量复制。使用需谨慎。
4 |
5 | ## 格式
6 | ```
7 | scp 本地文件 远程用户名@远程主机IP:远程路径
8 | ```
9 | 拷贝目录,要在scp后面加**-r**选项(不要把-r放到命令最后)。
10 |
11 | 举例:
12 | ```
13 | scp /usr/lib/libxxx.so root@123.123.123.123:/usr/lib/\
14 | scp -r /usr/lib root@123.123.123.123:/usr/
15 | ```
16 |
--------------------------------------------------------------------------------
/sed.md:
--------------------------------------------------------------------------------
1 | sed
2 | ===
3 | sed全称stream editor。其处理文本的理念为搜索替换。
4 | ---
5 | ## 基本格式
6 |
7 | sed '/pattern/replace' filename
8 | pattern是正则的模式串
9 | replace代表要替换的内容
10 | filename是要处理的文件名
11 | ## 命令
12 | ### p
13 | 打印,但是会重复打印一行
14 |
15 | sed '/key/p' filename
16 | 在文件中搜索包含key的行,打印的时候会重复打印两遍
17 | >若不指定关键字,比如`sed p filename`那么会打印所有行两遍。
18 |
19 | ### s
20 | s是substitute(替换)的缩写,可省略。引号可省略。
21 |
22 | sed 's/pattern/replace' file
23 | sed '/pattern/replace' file
24 | sed 's/pattern/replace/g' file
25 | sed '1,3s/pattern/replace/g' file
26 | * g 替换改行所有匹配。不加g,则只替换第1个
27 |
28 | *****
29 | ## 选项
30 | ### e
31 | 组合多个替换命令。
32 | ```bash
33 | sed -e 's/01/JAN/' -e 's/02/FEB/' -e 's/03/MAR/' -e 's/04/APR/' -e 's/05/MAY/' \
34 | -e 's/06/JUN/' -e 's/07/JUL/' -e 's/08/AUG/' -e 's/09/SEP/' -e 's/10/OCT/' \
35 | -e 's/11/NOV/' -e 's/12/DEC/'
36 | ```
37 | ### f
38 | 可以把替换命令都放到一个文件里,用**-f**来指定就可以了。
39 | ### i
40 | 将修改保存。无此选项,所有修改只会打印到屏幕而不会保存到文件。
41 | ### n
42 | 和p联用,打印符合条件的行。当然此时p打印不会重复
43 |
44 | 比如:
45 |
46 | sed -n '/0\.[0-9][0-9]$/p' filename
47 |
--------------------------------------------------------------------------------
/ssh.md:
--------------------------------------------------------------------------------
1 | ssh
2 | ===
3 | ssh是一个流行的安全协议,用于远程登录,局域网内文件传输等等。
4 | ## 基本概念
5 | 如果远程主机包含本主机的公钥认证文件,则本主机登录远程主机,无需再输入密码。
6 | 公钥认证文件,即将本主机的.ssh目录下的*.pub的公钥文件发送到远程主机的.ssh目录下,并更名为authorized_keys
7 | ## scp
8 | 用于局域网内文件的传输。scp即ssh copy的意思。
9 | ### 基本格式
10 | scp 原文件地址 目的地址
11 | 如果原地址或目的地址是远程主机,则写作**user@host:**。
12 | 远程主机目录缺省的情况,则为user的home目录。比如:
13 |
14 | scp .ssh/id_rsa.pub jelly@192.168.1.103:
15 | scp .ssh/id_rsa.pub jelly@192.168.1.103:.ssh/authorized_keys
16 | 前者将把本主机的公钥复制到远程主机的home目录下。
17 | 后者将复制到远程主机的.ssh目录下并更名为认证文件。
18 |
--------------------------------------------------------------------------------
/tcpdump.md:
--------------------------------------------------------------------------------
1 | tcpdump
2 | ======
3 | 经典的网络抓包工具
4 | ----
5 | - 官网地址:[tcpdump](http://www.tcpdump.org/)
6 | - 切记:用root身份使用此工具
7 |
8 | ## 默认输出信息
9 | 默认情况下,抓取`eth0`端口
10 | ```
11 | 19:10:54.150404 IP 192.168.1.103.52482 > 115.239.211.92.http: Flags [.], ack 1, win 229, length 0
12 | ```
13 | 不加任何选项的时候,其输出信息的各个字段的含义是:
14 | - 时间戳
15 | - ID号
16 | - 网络层协议类型(`IP`、`IP6`)
17 | - 数据发送方主机名(IP.端口)
18 | - >
19 | - 数据接收方主机名(IP.端口)
20 | - 运输层协议概要
21 |
22 | ### TCP协议信息
23 | #### Flags
24 | TCP报文首部有6位的flag字段,表示6种不同的标识:
25 | - **U**:`URGgent` 带外(紧急)数据,应进行传送,最高优先级
26 | - **A**:`ACKnowlegment` 确认标识
27 | - **P**:`PuSH` 推送,无需等待缓冲区填满,就理解发送
28 | - **R**:`ReSeT` 该标识为1的时候,表明TCP出现严重差错,必须释放连接
29 | - **S**:`SYNchronization` 同步序列号
30 | - **F**:`FINis` 正常释放一个连接
31 | - **.**:未设置任何标识
32 |
33 | #### seq
34 | ```
35 | seq 352:704
36 | ```
37 | 表示发送的其实序列号为352,发送的最后一个序列号为703(704-1),704是接下来ack返回的值。这个数据包的长度是352(352~703)
38 | ```
39 | seq 352
40 | ```
41 | 这样的数据报表示发送的起始序列号为352,但实际发送的长度为0
42 |
43 | #### ack
44 | 确认号。表示希望收到的下一个数组包的起始序号
45 | #### win
46 | 接收窗口
47 | #### options
48 | 选项
49 | #### length
50 | 数据包的长度
51 | ## 常用选项
52 | |选项|描述
53 | |:---:|----
54 | |-a|将IP地址和广播地址转变成名字
55 | |-A|以ASCII形式显示数据包内容
56 | |-c|在收到指定数量的数据包后,tcpdump就会停止
57 | |-d |将匹配信息包的代码以人们能够理解的汇编格式给出
58 | |-dd |将匹配信息包的代码以c语言程序段的格式给出
59 | |-ddd|将匹配信息包的代码以十进制的形式给出
60 | |-D|显示网卡设备
61 | |-e|打印`数据链路层`的头部信息
62 | |-F|从指定文件读取表达式,忽略其他表达式
63 | |-i|抓取特定网卡的流量,如`-i eth0`
64 | |-n|用IP地址表示主机,用数字表示端口号
65 | |-r|读取由`-w`选项抓取的包文件
66 | |-t|不显示时间戳
67 | |-tt|输出非格式化的时间戳,如`1430312629.265789`
68 | |-ttt|输出本行和前面一行之间的时间
69 | |-v|显示详细信息
70 | |-v|显示比`-v`更详细的信息
71 | |-w|将数据包写入文件`-w cap.log`
72 | |-X|用十六进制和ASCII码输出数据报详细信息
73 |
74 | ### -d/-dd/-ddd
75 | 待整理
76 | ### -n
77 | 用IP地址表示主机,而不是主机名;用数字表示端口号,而不是服务名称
78 | ```
79 | 192.168.1.103.52482 > 115.239.211.92.http
80 | 192.168.1.103.52482 > 115.239.211.92.80 //-n 选项
81 | ```
82 | >Linux中凡是涉及IP地址的工具,只要加上`-n`选项就不进行**反解**,比如`netstat`
83 | >>**反解**:指根据IP地址去查询主机名/域名
84 |
85 | ## 表达式
86 | tcpdump的表达式支持正则,此外它还具有几种关键字
87 | ### 类型关键字
88 | - host:主机名(或IP地址)
89 | - net :CIDR方法表示的网络地址。如`tcpdump net 1.2.3.0/24`
90 | - gateway:指定网关
91 | - port:端口号
92 | - portfange:端口范围。如`tcpdump portrange 1-1024`
93 |
94 | ### 协议关键字
95 | 指定要抓取数据报的协议类型:tcp、udp、icmp、arp、rarp、fddi
96 | ### 方向关键字
97 | - src:指定数据包的发送端
98 | - dst:指定数据报的目的端
99 |
100 | ### 比较关键字
101 | - greater:`tcpdump greater 1000`只抓取大于1000字节的流量
102 | - less:`tcpdump less 10`
103 |
104 | ### 逻辑关键字
105 | - and(`&&`)
106 | - or(`||`)
107 | - not(`!`)
108 |
109 | ```
110 | tcpdump src 192. or src 192
111 | tcpdump not port 80
112 | ```
113 | 如果表达式比较复杂的时候,可以用括号`()`括起来,但是需要`/`转义。或者用单引号`' '`来扩住,就可以不用转义
114 | ```
115 | tcpdump 'dst 10.0.2.4 and (src 192.1.1.103)'
116 | ```
117 | ## 高级用法
118 | tcpdump还允许直接使用数据包中的指定字节的内容来过滤数据包。
119 | ```
120 | tcpdump 'tcp[13] &2 !=0'
121 | tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
122 | ```
123 | ### 高级示例
124 | ```
125 | tcpdump 'gateway snup and ip[2:2] > 576'
126 | tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
127 | tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
128 | ```
129 |
130 |
--------------------------------------------------------------------------------
/telnet.md:
--------------------------------------------------------------------------------
1 | telnet服务端与客户端
2 | ====================
3 | 安装telnet服务
4 | =============
5 | ## 下载
6 | CentOS:
7 |
8 | yum install telnet-server
9 | Ubuntu:
10 | 有三个可选安装包:
11 | * telnetd-ssl
12 | * telnetd
13 | * inetutils-telnetd
14 |
15 | 选择一个安装:
16 |
17 | apt-get install telnetd
18 |
19 | ## 开启telnet服务
20 | 以上安装命令完成后,会自动在`/etc/xinetd.d/`目录下,生成一个文件**telnet**:
21 | 内容如下:
22 | ```
23 | # default: on
24 | # description: The telnet server serves telnet sessions; it uses \
25 | # unencrypted username/password pairs for authentication.
26 | service telnet
27 | {
28 | disable = no
29 | flags = REUSE
30 | socket_type = stream
31 | wait = no
32 | user = root
33 | server = /usr/sbin/in.telnetd
34 | log_on_failure += USERID
35 | }
36 | ```
37 | 开启xinet服务,就等于开启了telnet服务:
38 |
39 | service xinetd start
40 |
--------------------------------------------------------------------------------
/traceroute.md:
--------------------------------------------------------------------------------
1 | traceroute
2 | ==========
3 | 检查到达某一主机中间所经过的主机。默认为udp包。
4 | `traceroute www.baidu.com`
5 | ## -I
6 | 发送icmp报文。有时候,如果使用了路由器,会导致udp包的响应功能消失。从而显示星号。
7 | 此时可以使用-I选项(或-T,不过有时候-T不管用)
8 |
--------------------------------------------------------------------------------
/tree.md:
--------------------------------------------------------------------------------
1 | tree用树形图显示目录结构
2 | ## 缺省目录
3 | 缺省目录为`.`即当前目录。并且默认会递归显示子目录中的文件。
4 | ## 常用选项
5 | ### -d
6 | 只显示目录,不显示其他类型文件
7 | ### L
8 | 指定显示级别(深度),该值要大于0。
9 | 比如:
10 |
11 | tree -L 1
12 | 显示当前目录下的目录及文件。不去递归显示子目录中的文件。
13 |
--------------------------------------------------------------------------------
/vim/Normal模式.md:
--------------------------------------------------------------------------------
1 | # Normal模式
2 | Normal模式通称一般模式,是切换到其他两个模式的唯一入口
3 | ## 退出vim
4 | 一般模式下,键入`ZZ`,注意是大写。
5 | >如果文件未改动,则直接退出
6 | >如果文件被改动,则保存退出
7 |
8 | ## 模式切换
9 | ### 进入编辑模式
10 | ||描述|
11 | |:--:|------|
12 | |A|在光标所在行的行尾开始插入文本(Append)
13 | |a|在光标的下一位开始插入文本
14 | |i|在光标处开始插入文本(Instert)
15 | |O|在光标所在行的上一行,插入新行开始编辑文本
16 | |o|在光标所在行的下一行,插入新行开始编辑文本
17 | |R|替换模式,从光标所指处开始替换文本,不是逐字符
18 | |r|也具有替换功能,不同之处是只能替换光标所指处的那一个字符
19 |
20 | ### 回到一般模式
21 | 按一下ESC即可
22 | ### 撤销恢复
23 | undo和redo命令分别为`u`和`Ctrl+r`
24 |
25 | 大写字母`U`可以一次性撤销该行的所有变动
26 | >因为`r`具有替换的功能,所以redo要加一个Ctrl。
27 |
28 | ****
29 | ## 光标移动
30 | 重点操作
31 |
32 | |左 |下 |上 |右 |
33 | |:--:|:--:|:--:|:--:|
34 | | h | j | k | j |
35 | 这四个方向键都支持和数字组合使用,比如:
36 |
37 | 30 j
38 | 可向下移动30行,30是相对行数。不是移动到第30行。
39 | ### 向下移动n行
40 | 除了使用数字+j,还有快捷的方式是数字+回车,比如
41 |
42 | 30
43 | ### 向右移动n个字符
44 | 除了使用数字+l,还有快捷的方式是数字+空格,比如
45 |
46 | 10
47 | ### 移动到第n行
48 | - nG
49 |
50 | n为要移动的行号
51 | ### 移至首行:
52 | - gg
53 | - 1G
54 |
55 | ### 移至尾行
56 | G
57 | ### 移动到行首
58 | * 功能键``
59 | * 数字键0
60 |
61 | ### 移动到行尾
62 | * 功能键``
63 | * `$` 按键为Shift-4
64 |
65 | ### %跳转到配对括号
66 | ### 跳回到上一次光标位置
67 | * **``**(反引号两次,可来回切换)
68 | * `-o`:跳回上一次光标位置
69 | * `-i`:在`-o`之后使用,撤销跳回
70 |
71 | >比如我在第5行,敲下**gg**来到首行,此时按下``+o可以回到第5行,再次按下`+i`可再次回到首行。
72 | 而敲两次**``**,则可代替这两个组合键,在首行和第5行直接来回跳跃。
73 |
74 | ### 跳转到编辑过的位置
75 | * g, 顺序跳转回编辑过的位置
76 | * g; 逆序跳转回编辑过的位置
77 |
78 | ### 跳转到段落首、段落尾
79 | * { 段落首,如果段落上面有空行则跳到空行开头
80 | * } 段落尾最后一个字符处,如果段落后面有空行,则跳到空行开头
81 |
82 | ****
83 | ## 文本处理
84 | ### 剪切与删除
85 | vim中所有的删除其实都是剪切,命令为:
86 | * x
87 | * d
88 | * c
89 |
90 | #### x
91 | 删除单个字符,右边的文本左移一个字符
92 | #### d
93 | **d命令可以理解为d+一个移动命令。移动命令能移到哪里,就能删到哪里!!**
94 | |常用命令|描述|
95 | |:--:|:--------|
96 | |dd|剪切当前行,下一行向上移动|
97 | |de|!剪切光标之后单词的剩余部分|
98 | |dw|剪切光标之后单词的剩余部分|
99 | |d$|剪切光标之后该行的剩余部分|
100 | |dH|剪切光标所在行到屏幕顶行之间全部行|
101 | |dL|剪切光标所在行到屏幕底行之间全部行|
102 | |D|同d$|
103 | >dw和de的区别是:dw会把两个单词间的空格也删掉,而de不会
104 |
105 | >数字n+dd可以剪切n行,从光标所在行向下算起
106 |
107 | #### c
108 | c功能和d相同,区别在于完成剪切后进入INSERT模式
109 | cc功能同dd,区别在于完成剪切后进入INSERT模式
110 |
111 | >每行删除第一个字符`:%s/^.//g`
112 |
113 | ### 复制
114 | yy
115 |
116 | 同理可以使用数字n+yy表示复制n行
117 | ### 粘贴
118 | 粘贴都是在新行粘贴,不是覆盖粘贴
119 | - p 粘贴到光标所在行下一行
120 | - P 粘贴到光标所在行上一行
121 |
122 | ## 重复上一次对文本进行的操作
123 | 用`.`
124 |
--------------------------------------------------------------------------------
/vim/README.md:
--------------------------------------------------------------------------------
1 | Vim之道
2 | ===
3 | 子曰:“工欲善其事,必先利其器”
4 | ---------------------
5 |
6 | ||一句话:编辑器之神|
7 | |-----|-----|
8 |
9 |
10 | Vim的命令区分大小写!大部分命令能和数字组合使用,此时数字在命令前面,或是两个命令之间。
11 |
12 | ## 符号约定
13 | 当本文涉及组合键的时候:
14 | - 如果是加号+,表示两个键先后按下(有时也省略加号);
15 | - 如果是减号-,表示两个键同时按下。
16 | - 本文组合键中间无空格。
17 |
18 | ## 授人以渔
19 | 在终端输入`vimtutor`可以进入vim使用教程。在vim编辑器中输入`:help vimrc-intro`可以进入vimrc文件的编辑教程
20 |
--------------------------------------------------------------------------------
/vim/Tips.md:
--------------------------------------------------------------------------------
1 | 各种Tip
2 | =======
3 | ## 格式化文本
4 | Normal模式下:`gg=G`
5 | ## 录制宏
6 | 1. Normal模式下,按q+寄存器名开始录制,比如:`qa`
7 | 2. 再次按q结束录制。
8 | 3. 使用@+寄存器名执行该宏,比如:`@a`
9 |
10 | ## 显示TAB
11 | Normal模式下:`set list`
12 | 然后TAB会显示成`^I`,并且行尾会显示`$`,从而看出行尾空格。
13 | ## ctags插件
14 | 首先使用**ctags -R**在当前目录下生成tags文件。然后再次用vim编辑文件的时候,即可实现函数和宏跳转。
15 | 使用`-]`可以跳转到函数,宏定义处。
16 |
17 | ---------------------------------------
18 | ## 程序员技巧
19 | ### 函数相关的跳转
20 | |按键|说明
21 | |---|---
22 | |[[|如果在函数体内,则跳到函数起始**{**处,如果已经再该位置则跳转到上一个函数的**{**处
23 | |][|如果在函数体内,则跳到函数结尾**}**处,如果已经再该位置则跳转到下一个函数的**}**处
24 | |]]|跳转到下一个函数的起始**{**处
25 | |[]|跳到上一个函数的结尾**}**处
26 |
27 | ### 宏,变量相关
28 | |按键|说明
29 | |---|---
30 | |]+i|查看变量的定义
31 | |[+d|查看宏的定义
32 | |g+d|跳转到变量定义处
33 |
34 | ### 查看man手册
35 | 在单词位置按**K**(`-k`)。
36 |
--------------------------------------------------------------------------------
/vim/Visual模式.md:
--------------------------------------------------------------------------------
1 | Visual模式
2 | ==========
3 | Visual模式又分为三种visual模式
4 | ----------
5 | |plain visual|block visual|linewise visual
6 | |:----------:|:----------:|:----------:|
7 | ## plain visual(普通)
8 | Normal模式下,键入`v`进入`plain visual`模式
9 | ## block visual(块选)
10 | `Ctrl-v`进入`block visual`模式,该模式可以竖着选中一列或几列;
11 | 所有的操作也将作用于所有选中列。
12 |
13 | |按键|描述|
14 | |----|:----|
15 | |A|追加,更新到所有行|
16 | |c|剪切单个字符并进入插入模式|
17 | |C|剪切整行并进入插入模式|
18 | |d|剪切列|
19 | |D|剪切选中行|
20 | |I|插入|
21 | |r|替换单个字符|
22 | |R|替换选中行,与其他命令不同,不更新到所有行,而是替换成一行|
23 |
24 | ## linewise visual(行选)
25 | Normal模式下,键入`V`(shift-v)进入`linewise visual`模式。
26 | Normal模式下,键入`]+d`可进入该模式,并选中光标所在行到尾行间所有行。
27 |
28 | 所有的操作都是以行为单位的,只关系光标所在行,而不关心光标所在位置。
29 |
30 | 其余用法同`plain visual`模式。
31 |
--------------------------------------------------------------------------------
/vim/命令模式.md:
--------------------------------------------------------------------------------
1 | 命令模式
2 | ==========
3 | 又称命令行或指令列模式
4 | ## 进入命令模式
5 | 键入:/ ?,光标移动到最下面一行,开启命令模式
6 | ## :
7 | - 保存退出:wq
8 | - 强制保存退出:wq!
9 | ### 调用外部命令
10 | `:!`然后再输入shell的命令即可直接在vim的界面调用shell命令。
11 | ## /和?
12 | 在一般模式下,键入`/`后,光标移动到最下面一行,显示一个/。这时可以进行文本的查找和替换。
13 |
14 | /tom
15 | /\
16 | 前者当找到包含tom的单词时会高亮显示。后者只匹配tom这个单词时会高亮。
17 | 按键n为显示下一个(?时为上一个)。
18 |
19 | `?`与其功能相同,唯一的不同之处是,`/`是向下查找,而`?`是向上查找。
20 | ## 打开多窗口
21 | `:new <文件名>`就能在一个新窗口里打开另一个文件。
22 | ## 分割窗口打开文件
23 | - 竖直分割:`:sp`
24 | - 水平分割:`:vsp`
25 |
26 | ## 替换
27 | `:%s/pattern/replace/gc`
28 | pattern是要替换(查找)的模式串,replace是替换的结果。gc是两个选项
29 | * g global 全局替换,无此选项则只会替换一行中的第一个匹配。
30 | * c confirm 确认,在替换之前进行确认
31 |
32 | ## 删除全部内容
33 |
34 | :%d
35 |
--------------------------------------------------------------------------------
/vmstat.md:
--------------------------------------------------------------------------------
1 | vmstat
2 | =====
3 | `virtual memory statistics`**实时**输出系统中各种资源的使用情况
4 | ## 基本格式
5 | vmstat [选项] [delay[count]]
6 |
7 | ## 缺省输出
8 | 缺省情况下(无选项),vmstat的输出内容相当丰富,比如:
9 | ```
10 | procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
11 | r b swpd free buff cache si so bi bo in cs us sy id wa st
12 | 0 0 0 2469012 489604 1451368 0 0 36 131 996 1043 23 4 72 1 0
13 | ```
14 | >vmstat功能丰富,实际上**vmstat**命令主要用于查看系统内存的使用情况。我可以使用**iostat**获得磁盘使用情况的更多信息,使用**mpstat**获得CPU使用情况的更多信息。
15 |
16 | |procs|进程信息
17 | |:--:|----
18 | |r|(runnable)等待运行额进程数目,即**就绪状态**
19 | |b|(blocked)处于不可中断睡眠状态的进程数目,即**阻塞状态**
20 |
21 | |memory|内存信息(单位KB)
22 | |:--:|----
23 | |swpd|交换分区(虚拟内存)的使用数量
24 | |free|空闲内存的数量
25 | |buff|**buffer cache**的内存数量
26 | |cache|**page cache**的内存数量
27 | >buffer cache:从磁盘读入的数据可能被保存在**buffer cache**中,以便下一次快速访问。
28 | >>page cache:待写入的数据首先被放到**page cache**中,然后由磁盘中断程序写入磁盘
29 |
30 | |swap|交换分区的使用信息(单位KB/s)
31 | |:--:|----
32 | |si|(swap input)数据由磁盘交换至内存的速率
33 | |so|(swap output)数据由内存交换至磁盘的速率
34 |
35 | |io|块的使用信息(单位block/s)
36 | |:--:|----
37 | |bi|(block input)从块设备读入的速率
38 | |bo|(block output)向块设备写入的速率
39 |
40 | |sys|系统信息
41 | |:--:|----
42 | |in|每秒发生的中断次数
43 | |cs|每秒发生的上下文切换(进程切换)次数
44 |
45 | |cpu|CPU使用信息
46 | |:--:|----
47 | |us|系统所有进程在用户空间的时间占CPU总时间的比例
48 | |sy|系统所有进程在内核空间的时间占CPU总是就的比例
49 | |id|表示CPU处于空闲状态的时间占CPU总运行时间的比例
50 | |wa|表示CPU等待I/O事件的的时间占CPU总运行时间的比例
51 |
52 | ## 参数
53 | - delay:采样间隔(单位s)
54 | - count:采样次数|共输出count次统计信息
55 |
56 | delay和count是参数,而非选项,实际使用的时候用数字代替。比如:
57 | ```
58 | vmstat 5 3
59 | ```
60 | 每个5秒输出一次结果,共输出3次
61 | ## 常用选项
62 | |选项|描述
63 | |:--:|----
64 | |-f|显示系统自启动以来执行的fork次数
65 | |-s|显示内存相关的统计信息以及多种系统活动的数量
66 | |-d|显示磁盘相关的统计信息
67 | |-p|需要参数,显示指定磁盘分区的统计信息
68 | |-S|使用指定的单位来显示,如k、K,m,M
69 |
70 | ### -S
71 | - k:1000
72 | - K:1024
73 | - m:1 000 000
74 | - M:1 048 576
75 |
76 |
--------------------------------------------------------------------------------
/whereis.md:
--------------------------------------------------------------------------------
1 | whereis
2 | ========
3 | 查找二进制文件、源码和man手册文件
4 | -----------
5 | 该命令并不会搜索整个文件系统,只查找部分目录:/bin、/etc/、/usr/share/man
6 | ## 基本用法
7 | whereis 选项 要查找的文件名
8 | 可以一次性查找多个文件
9 | 下面介绍各种选项
10 | ## 指定搜索的类型
11 |
12 | |选项|描述|
13 | |----|-----
14 | |-b|二进制文件
15 | |-m|man手册
16 | |-s|源码
17 | ## 指定搜索路径
18 | |选项|描述|
19 | |----|-----
20 | |-B|指定搜索二进制文件时的路径
21 | |-M|指定搜索man手册时的路径
22 | |-S|指定搜索源码时的路径
23 | |-f|用于终止,要搜索的目录列表
24 |
25 | 比如:
26 | whereis -B /usr/bin /usr/local/bin -f ls
27 |
28 |
29 |
--------------------------------------------------------------------------------
/过滤器/README.md:
--------------------------------------------------------------------------------
1 | 过滤器
2 | ========
3 | 过滤器一词,出自《Unix & Linux 大学教程》
4 | 多用于文本处理
5 | - [x] 基本操作
6 | * [cat](# cat)
7 | * [tac](# tac)
8 | * split
9 | * [rev](# rev)
10 | * head
11 | * tail
12 | * colrm
13 | - [x] 比较
14 | * cmp
15 | * comm
16 | * [diff](# diff)
17 | * sdiff
18 | - [x] 抽取
19 | * [cut](# cut)
20 | * paste
21 | - [x] 格式化
22 | * nl
23 | * [wc](# wc)
24 | * expand
25 | * unexpand
26 | * fold
27 | * fmt
28 | * pr
29 | - [x] 其他
30 | * look
31 | * [uniq](# uniq)
32 | * join
33 | * [sort](# sort)
34 | * tsort
35 | * strings
36 | * [tr](# tr)
37 |
38 | >该目录的索引借鉴的《Unix&Linux大学教程》一书
39 |
40 | ## sort
41 | 排序
42 |
43 | |常用选项|描述|
44 | |:------:|----|
45 | |u|去除重复行
46 | |r|倒序
47 | |f|忽略大小写
48 | |n|基于数字排序
49 | ## uniq
50 | `unique`是唯一的意思。就是去除掉文件中的重复行。
51 | 但是只能去除相邻行中的重复行。
52 | 也就是说,如果重复发生在不相邻的行,是不能被去掉的。所以uniq一般与sort联用。
53 | >这大概就是KISS原则的体现吧。
54 |
55 | ### -d
56 | `uniq -d`去除不重复行,留下重复的。
57 | 同样要记得和sort联用。
58 | >一次,在一个Linux群里,一个群友的公司,生产的产品包装盒上的条码有重复,
59 | 他想找出重复条码。条形码文件有上万行,他公司电脑是Windows的,本来他想写一个python脚本来解决的,
60 | 后来实现起来也有点麻烦,我就帮他用uniq -d命令来实现了。开始我没有排序。
61 | 发现没有任何输出。后来我加上sort排序,再使用uniq,就找出了,有重复行的四条记录。
62 |
63 | ## cat
64 | * 打印文本内容
65 | * 进行多个文件的连接,并打印
66 | * 通过重定向,将标准输入的回显写入文件中
67 |
68 | >cat的由来,很多人认为是concatenate(连接)的缩写。
69 | 其实不然,他是古老的单词catenate,意味着to join in a chain。
70 | catena是chain的拉丁语单词。
71 | ----《Unix&Linux大学教程》
72 |
73 | ## tac
74 | 与cat相反,它会按行反序打印文本。
75 | ## rev
76 | 将字符反序。
77 | ## cut
78 | ## wc
79 | 统计文本内信息的数量
80 |
81 | |常用选项|描述|
82 | |:------:|----|
83 | |l|只统计行数|
84 | |w|只统计单词数|
85 | |m|只统计*字符*数|
86 | |c|只统计*字节*数|
87 | |L|最大行的长度|
88 | 不管指定选项的顺序如何,其信息显示的顺序都是固定的,遵从上面从上到下的顺序。
89 |
90 | 若不加参数,则默认显示l,w,m三项。
91 | ## tr
92 | ## diff
93 | ## aspell
94 | 拼写检查,只能检查英文,故不常用
95 |
--------------------------------------------------------------------------------
/过滤器/split.md:
--------------------------------------------------------------------------------
1 | split文件分割命令
2 | ================
3 | split [OPTION] [FILE [PREFIX]]
4 |
5 | > split是以行为单位分割的
6 |
7 | ## FILE
8 | 要分割的文件名
9 | ## PREFIX
10 | 可以指定分割后的小文件的文件名前缀为**PREFIX**,缺省为**x**。
11 | ## OPTION
12 | 常用选项:`-d`、`-l`、`-a`
13 | ### -a
14 | split -a num FILE
15 |
16 | 表示将文件FILF分割后的小文件名中包含num位后缀,缺省为**2**位。
17 | ### -l
18 | split -l lines FILE
19 |
20 | 表示将文件每lines行分割成一个文件。缺省是**1000**行
21 | ### -d
22 | 无参数。表示文件分割后生成的小文件的名字以数字命名。
23 |
24 | 在未指定**PREFIX**以及**-d**选项的时候,生成的文件名是:`xaa`、`xab`、`xac`……。
25 |
26 | 指定了**-d**选项之后是:`x00`、`x01`、`x02`……
27 | ## 综合实例
28 | split -l 10 -a 3 log `date +%F`. -d
29 |
30 | 分割log文件。分割后的文件名为:`2015-06-25.000`、`2015-06-25.001`、`2015-06-25.002`、
31 |
--------------------------------------------------------------------------------