├── .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 | |![](http://gcc.gnu.org/img/gccegg-65.png)|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上直观的按键,取而代之的是大量的命令。为此,只有从点滴学起,慢慢积累|![](http://www.gnu.org/software/gdb/images/archer.jpg) 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 | |![](http://git-scm.com/images/logo@2x.png)|抛弃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 | |![](http://img.my.csdn.net/uploads/201406/15/1402811722_5338.png)|一句话:编辑器之神| 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 | --------------------------------------------------------------------------------