shortcuts

  0   # 标准输入,如: 0>, 0>> (数字零可不写)
  1   # 标准输出,如: <, 1< (数字1可以不写))
  2   # 标准错误输出, 如:2>&1表stderr重定向到stdout
  !!  # 上一条命令
  !$  # 上一条命令的参数
  shift + PgUp  # 滚屏
  ctrl + +   # 放大(+-缩小,+0原始大小)
  ctrl + p   # 显示上一条命令(或方向键)
  ctrl + n   # 显示下一条命令
  ctrl + r   # 输入关键字以搜索历史命令,没有继续按ctrl+r!
  ctrl + c   # 放弃当前行命令,开启新行;或终止当前前台运行的程序!
  ctrl + z   # 挂起当前前台运行的程序! 一般会配合 bg 使其后台运行
  ctrl + d   # Delete,无可删时退出当前会话!

  ctrl + a   # 光标移动到行首
  ctrl + e   # 光标移动到行尾
  ctrl + f   # 光标向前移动一个字符
  ctrl + b   # 光标向后移动一个字符
  ctrl + h   # Backspace
  ctrl + u   # 删除光标左边所有字符
  ctrl + k   # 删除光标右边所有字符
  ctrl + w   # 删除到单词的开头(不包括当前单词)
  ctrl + y   # 粘贴刚才所删除的单词
  ctrl + /   # Undo(C-d删除的不算!)
  ctrl + v   # 转义键,比如输入该组合后再按TAB就是TAB的ASCII表示!
  ctrl + i   # 相当于TAB,ctrl+m:相当于回车!
  Alt  + .   # 上条命令的最后一个参数, M-0-. :第1个参数

  ctrl + PgUp          # 前一个标签  ctrl + shift + T 新建标签(ctrl+shift+W关闭)
  ctrl + shift + PgUp  # 当前标签左移
  ctrl + shift + Q     # 关闭终端
  ctrl + shift + N     # 新建终端
  ctrl + shift + C     # 复制, 粘贴:ctrl+shift+v
  ctrl + x + u         # 撤销(先按ctrl+x松开x继续按u)

common cmd

  su - lei  # 将用户切换为lei,也带上其环境变量
  env       # 显示所有的环境变量; ; source ~/.bashrc :立即生效
  date +%F  # 如:2014-04-09
  yes xxxx  # 不停的输出字符串
  printf '\e[31m%s\e[m \e[1;33m%d\e[m\n' "Hello" 34
# col [-bfpx] [-l num]  :b(过滤掉控制字符^H,常用!) x(空格表TAB) l(缓冲列数,很少用)
# 改变当前用户的shell,修改了/etc/passwd!-l:显示系统所有shell:/etc/shells!
  chsh -s $(which zsh)

  man 5  # 配置文件的帮助; 1:命令的帮助(默认) 2:系统函数 3:C库函数
  write USER < file  # 给已登录的用户leiz发送信息,信息内容在文件file中
  wall  MSG  < file  # 给所有已登录的用户发送信息或文件内容

# ls
  # -A: 类似-a,但.及..不会列出! .. | grep '^\.' 只显示隐藏文件
  # -R: 递归查看子目录
  # -S: sort by file size.  -r:倒序  -t:以时间排序
  # -F: 把目录都加上'/',软连接'@',可执行'*',套接字'=',FIFO'|'
  ls -lhF | grep *$  # 列出当前目录所有可执行文件,-h:human-size.
  ls -d */ # 列出当前目录下所有一级子目录
  ls -dl   # 列出当前目录属性
  ls {a?,b*,1..5}  # 表示a开头的2字符的文件+b开头的文件+文件名为1、2、3、4、5
  alias l.='ls -d .*'  # 只显示隐藏文件

# file
  mkdir -pm 777 /t/{2,3}  # 创建目录包括父目录并且制定目录的权限,1/下有两个文件夹2,3
  touch {1..3}.txt   # 创建文件1.txt,2.txt,3.txt
  ln -s /usr/d ../g  # 当前目录的上层目录创建一个文件名为g的软连接-->/usr/d(注意:源位置一定要是绝对路径!)
  rm  -rfv tmp test  # 递归删除tmp文件夹以及test文件(v:显示信息).注意指定的文件不能过多<=20.删除目录也可以 'rmdir -p'
  # cp和mv都不支持创建到目标位置的中间路径!如果目标目录(或文件名)不存在则会重命名源文件夹(或源文件名)到目标!
  # 如果cp或mv多个源,则目标必须是已存在的目录,否则命令失败!
  \cp -rpf t1 t2 /t  # 将t1+t2文件/文件夹及其属性全部cp到/t目录,需要有x权限. \cp指示不要使用alias; -f强制覆盖!
  mv  -f t1 t2 /tmp  # 此时目标/tmp必须是个目录.

# tree
  # -d:仅显示目录  -C:加上彩色  -t:用更新时间排序  -F:同ls的-F
  # -sh:显示大小  -p:显示权限  -L:后面跟数字,显示的层数
  tree -CDtsh .

  # date cal dc
  file f     # 查看文件的类型
  head -8    # 显示到倒数第9行,默认前10行.-n可省略,-c:按字符.类比tail.
  tail -F x  # 可以连续实时追踪文件变换,当目标是个软连接时,即使其被改变了也会自动重定向到新的文件
  od -t c f  # 以ASCII查看文件f, -d:十进制, -x:十六进制
  type cmd   # 查看命令是否是内建的
  history 3  # 查看最近3个命令
  umask -S   # 查看默认的文件访问属性
  wc -l      # 查看文件file有多少行) -c(多少个单词) -m(多少字节)
  locate f   # 简单的查找一个文件,updatedb:更新数据库以便新文件可以被查找到
  which gcc  # 可行文件gcc的路径
  whereis z  # 查找系统文件的位置

# cat & stat
  # %A: Access rights in human readable form
  # %T: type in human readable form
  # %F: file type
  # %G: group ID of owner
  # %u: user ID of owner
  # %u: user name of owner
  # %i: inode number
  # %n: name of the file
  # %s: total size in bytes
  # %x: time of last access
  # %y: time of last modification
  # %z: time of last change
  stat -c "%s %n" file :只显示出file的大小和名字
  cat -b f1 f2 >> f3 # 两个档案的纯内容加上行号追加到f3. -n:加上编号,-b:空白行不编号,-s:--squeeze-blank,连续的空白行压缩为1行.
  cat /dev/null > f  # 清空文件
  cat >> file        # 从键盘输入追加到文件,C-d结束输入;如下可以指定特殊字符结束输入.
  # cat > file << EOF  # EOF结束输入(必须独占1行且不含任何空格!),也可以把'<< EOF'写到cat后面

# jq
  # 格式必须标准,key必须使用双引号,最后一个item不能有逗号
  # -r   :如果过滤的结果是字符串则显示时去掉双引号,raw-output
  # .foo :大小写敏感,包含该子串的所有属性
  # .[1] :访问数组的第2个元素
  # .{name:.arr[1].name} :访问对象arr数组的第2个元素的name属性,映射名为name
  jq ".[]" a.json
  cat a.json | jq .
# cloc
  # --by-file :也列出目录中每个文件的行数
  cloc --exclude-dir=.git .  # 统计代码量

Permission

  文件类型权限 硬连接数 所有者 所属组 文件大小(不准确) 最后修改时间  名称
  drwxr-xr-x  2       root   root  4096            12-01 20:52  bin

  示例权限:  0421: sticky位, 4(read) 2(write) 1(execute)
  目录权限x: 该目录可以被cd(子目录不一定),该权限是其他权限操作的基础(以下权限都隐含本权限)!
  目录权限w: 该目录下可以touch、mv、rm自己创建文件;要递归mv、rm子文件夹,子文件夹也必须具有wx权限!
  目录权限r: 该目录可以被ls,若无x权限则ls -l只能列出文件名,不能正常显示文件属性信息!
  目录权限t: 粘着位sticky:o+t.用于约束具有777权限的目录,使用户不能删除该目录下不属于自己的文件. 1755
  可执行文件权限u+s: 普通用户在执行该文件时,临时以root身份来执行该文件!普通文件具有s权限没有什么意义! 4755
  可执行文件权限g+s: 普通用户在执行该文件时,临时以root组身份来执行该文件!如touch时,该文件的所属人会变为root. 2755

chmod

  • 注意: chmod如果只写目录的话仅对目录有效,要想对旗下所有生效除非有-R选项或使用*通配符.
  • 注意: chmod -R +w-R -w这种写法可能存在bug,不能如预期执行,请使用完整语法: -R a+w!
  • 注意: 改变文件的属主,会清除suidguid位!
setuid; setgid; sticky;  # 4 2 1, u+s g+s o+t, 这个属性放在数字权限的最开头,如1777表示:o+t

# 可用于目录或文件!只有属主或root可以对tmp执行rm、mv,即使其他人有w权限!
# -rwx--x--t,这表示others具有x权限,另外该文件具有sticky位!
sticky
# 只对文件有效!表任何可以运行此文件的用户将具有该文件属主一样的权限去运行该文件!
# -rws--x--x,若owner不具有x权限,则用大写S代替!
setuid
# 只对目录有效!表任何复制到此目录的对象将具有与此目录相同的所属组,除非复制时用-p参数!
# drwx--S--x,大写表示group不具有x权限,另外该目录具有setgid位!
setgid

# immutable:保护文件不被(包括root)删除、改名、链接、写入;目录则不可创建+删除文件; -i:是移除该属性,防止root删除不了!
chatrr +i test

# 递归(本身+所有子目录和文件)改变文件夹t的拥有者及所在群组为owner_name
chown -R owner_name:group_name t
# 递归改变文件或文件夹file的所属群组
chgrp -R group_name file
# user+group拥有rx,others拥有x,所有用户去除w;所有时可不写出a但w比较变态,见上头注释!
chmod ug+rx,o=x,a-w tmp

tar

默认解压目标文件到当前目录!

  # -C: 改变工作目录,一般用于解压到指定的目录!
  # -f: 该选项最好独立出来,指明要被解压的文件,或要压缩到的文件;一般把该参数放在所有参数的最后!
  # -x: 解压,对应的是压缩-c;事实上解压无需指定目标文件格式,tar会智能匹配!
  # --exclude file: 排除某些目录或文件

  tar -tzf file.gz 查看压缩文件的内容
  tar -ruf sample.tar /etc/profile # 将目录中更新的文件追加到sample.tar
  tar -xvf sample.tar readme.txt   # 单独解包其中的readme.txt
  tar -xzf sample.tar.gz -C ../    # 使用gzip解压sample.tar.gz到上一层目录
  tar -xZf sample.tar.Z  # uncompress;
  tar -xf sample.tar.xz  # 如果不能解压bzip2文件则需安装bzip2
  tar -cjf sample.tar.bz2 ./sample --exclude=dir1 --exclude=dir2  # 解压后包含了路径sample; -czf:.tar.gz
  tar -cvJf sample.tar.xz ./sample
  # 对tar文件压缩加密/解密;这里的'-'表标准输出/输入!
  tar cf - fold | openssl des3 -salt -k pwd | dd of=fold.tar.des3
  dd if=fold.tar.des3 | openssl des3 -d -k pwd | tar xf -

  # 7zip
  7z a -mhe -p 1.7z dir/ -xr\!exclude_dir  # 加密压缩,排除目录(r:递归,!:通配符);被操作目录/文件也可使用通配符!
  7z x -r xx.7z -o outdir  # 注意不要使用'7z e',否则会丢失文件的原本目录!
  zip -re 1.zip 1/ -x "./1/2/*"  # 排除2子目录. e:加密但不加密文件名! r:递归

  # 把file1添加到tar.rar,m:移动到;rar中存在会update,rar不存在会创建tar.rar
  # 不写file1会将当前目录下的所有文件+文件夹压缩到tar.rar!
  rar a tar.rar file1  # 还可以加入多个文件
  rar d tar.rar file1  # 删除tar.rar中的file1(目录或文件)
  rar l tar.rar  # 查看压缩文件的内容
  rar x tar.rar  # 解压并保持目录结构
  rar c tar.rar  # 添加注释

users

伪用户UID:1-499
伪用户:无法登陆系统,无家目录,用来更安全的进行系统或应用操作!

普通用户UID:500-60000

  users  # 所有登录的用户名称,如果该用户使用多个终端则显示多次
  last -n 5  # 当前用户最后5条登录信息; last leizi :用户leizi的所有登录信息
  who; w; id; whoami; finger; groups;
  cat /etc/passwd  # 所有用户,只要用户的UID=0该用户就具有root权限;
  cat /etc/shadow  # 保存用户的密码(第二部分),删除后便不需要密码
  cat /etc/group   # 所有组

  # -d leiz 删除用户leiz的密码,这样可以使用空密码登录了
  # -S leiz 查看用户leiz密码的状态
  # -l leiz 锁定用户leiz,该用户长时间不使用;shadow文件密码部分最前面多加2个叹号!
  # -u leiz 解锁用户leiz,-uf:强制解锁
  passwd

  # -l lz 查看用户lz密码状态
  # -E -1 设置用户密码过期日,0:立即过期, -1:表示永不过期,
  # -W 3  密码过期前,提前多少天警告用户?默认是7
  chage

  # -u 指定用户的UID.如 888
  # -g 组名.如果-g或-G不指定,系统会新建一个以该用户名为组名的组
  # -G 可以属于多个组,逗号隔开
  # -d 宿主目录.如 leiz
  # -M 不建立宿主目录
  # -s shell,如 /bin/bash,指定为/sbin/nologin则不允许登陆
  # -c 注释,如果中间有空格应使用双引号
  # -e 失效时间,如 2011-1-15
  useradd; groupadd [name]

  # -r 也删除该用户的宿主目录
  userdel; groupdel

  # -l newname oldname 登陆名的修改
  # -G group1 user1  将用户user1添加到组group1
  # -L leiz 锁定用户leiz
  # -U leiz 解锁用户leiz
  usermod; groupmod

string

uniq

  • 控制连续重复的行如何显示
    如果要过滤掉那些不连续的重复行一般配合sort!
  • 不加任何参数:连续重复的行做1行看待!
    加上-c参数可以查看重复的次数
  # -i 忽略大小写
  # -c 重复的行仅显示一次,并在每一行的最前面标出该行有几次重复(用来取代-u -d选项)
  # -u 显示文件中没有连续出现的行(仍然按照其在文件中的顺序:默认)
  # -d 显示文件中连续出现的行(一次)
  # -D 显示文件中连续出现的行(多次)
  # -f 忽略第一列,显示连续出现的行(一次)

sort

默认按照第1列(Field0)排序,默认的域分隔符是空格

  # -o 如'-o sortedfile.db',将输出结果保存到文件
  # -c 如'-c testfile.db',测试文件是否按照指定的方式排序了
  # -n 按照数字而不是字符排序
  # -r 反向排序
  # -R 乱序Random,类似于shuf.
  # -t 指定分隔符(只允许1个字符!),后面直接跟分隔符,或(负责的可以引起来) -t :
  # -k 指定按照哪列排序,后面直接跟数字,或(第2列) -k 2
  #  -k3nr :按第3列的数字从大到小顺序排序
  #  -k6.1,6.2 :按第6列的第1个字符到第2个字符来排序.默认从指定的列到最后按照字母顺序排!
  # -u 去除结果中的重复行
  # -c 忽略前面的空格部分
  # -m 如'sort -t: -m 1.txt 2.txt',合并两个文件,并按照第一列默认排序

cut

提取每一行的第几个域的内容,注意:它只认单个字符作为分隔符:

注意: 它以空格作为分隔符来分割某些命令的结果可能会得到尾部有很多空格的家伙.所以尽量使用awk.

  # -b 3-5,8: 提取每一行的第3,4,5,8个字节!配合-n可以不将多字节字符分开!
  # -c 3-:  提取每一行的第3,4...到最后一个字符
  # -d ' ': 必须和-f一起使用!指定分隔符(只允许1个字符!).默认是制表符!
  # -f -3:  按分隔符划分好列,取第1,2,3列

split

  # -l: 按行切割
  # -b: 按字节切割(如果是文本文件格式则同一行可能被切分到不同的文件)
  # -d: 使用后缀作为后缀名
  split -l 1000 file

join

合并两个文件的对应行

默认以空格分隔各列,并比对两个文件的第1行.

  # -j 1.2 2.1: 第1个文件的第2列与第2个文件的第1列进行比对匹配!或使用: -1 2 -2 1
  # -i:  --ignore-case
  # -t:  指定分隔符,默认是空格或TAB.
  # -a1: 显示第1个文件中不匹配的行,left-join; -a2:第2个文件...
  # -v1: 只显示第1个文件中不匹配的行; -v2
  # -o 1.1 2.1: 指定输出格式,只输出第1个文件的第1列与第2个文件的第1列!
  join -i file1 file2

paste

  # -d: delimiters,必须为单个字符的列表,默认是TAB!
  # -s: 把文件f的所有行先写在1行,然后把paste的其他文件同样处理追加过去!
  paste -d ' |' f1 f2 f3  # 把f2的第i行追加到f1的第i行(1个空格分隔)产生新的i行,f3的i行再次追加到新的i行(|分隔).

signal

  # SIGINT: Ctrl + C,终止进程
  # SIGSTP: Ctrl + Z,停止进程就是pause进程.会产生一个作业号
  # trap commands signals
  trap echo 'Oops!' SIGINT SIGTERM
  trap "echo bye" EXIT  # C-C或脚本正常退出时都会触发!
  trap - EXIT  # 终止捕捉某个信号

diff & patch

  # -u: 以统一的紧凑格式创建补丁文件
  # -N: 确保补丁文件能够正确的处理已经创建或删除文件的情况!
  diff -ruN src dst > f.patch

  # -E:  发现了空文件就删除
  # -R:  reverse,将新版本编程老版本
  # -p1: 指滤去patchfile的前1层目录,当前要被打补丁文件夹所在的目录加为第0层.
  # 进入当前要打补丁的文件夹后,为第1层目录.p1表示第1层不打补丁!
  patch -E -p0 < patchfile  # patchfile必须与将要被打补丁的文件夹处于同级目录!