Thursday, October 16, 2008

[Linux]几个常用的Linux命令/工具的用法举例

这里是我平时常用到的几个linux命令以及比较trick的一些参数,附带简单的使用例子
文件操作

  • ls
    参数:
    • -h: 以人易读的格式显示文件大小 (比如 1K, 234M, 2G这样)
    • -R: recursively显示子目录下的文件
    • -t: 按修改日期排序(最近修改的靠前)

  • tar
    实例:
    • 例1:把foo这个目录打包并使用gzip压缩,并自动剔出.pyc文件以及version control的文件
      $tar -zcf foo.tar.gz --exclude '*.pyc' --exclude-vcs foo
    • 例2:把foo这个目录打包,但是用lzma压缩(lzma有比gzip的压缩比高,解压快的特点.但是压缩的时候慢)
      $tar -cf foo.tar.lzma --lzma foo
    • 例3:解压foo.tar.gz
      $tar -zxf foo.tar.gz
    • 例4:解压foo.tar.bz2
      $tar -jxf foo.tar.bz2
    • 例5:查看foo.tar.gz包内容
      $tar -tf foo.tar.gz

  • rm
    实例
    • 例1:删除一个叫--foo的文件
      $rm -- --foo
    参数
    • --: 删除以"-"开头的文件

  • find
    实例
    • 例1:找出$HOME 底下(recursively)所有以apc999开头的,owner为apc999的,permission为755的,创建时间为1天以前的文件
      $find ~ -name "apc999*" -user apc999 -perm 755 -mtime 1
    • 摆脱烦人的"permission denied"警告
      $find ~ -name "apc999*" -print 2> /dev/null 
进程操作

  • ps
    实例
    • 例1:显示当前终端的所有进程:
      $ps
      PID TTY          TIME CMD
      12713 pts/24   00:00:00 tcsh
      12840 pts/24   00:00:00 ps
      
    • 例2: 显示所有当前用户进程(包括使用了其他终端的) x, 显示进程的用户名 u,并用树型表示其父子关系 -H
      $ps ux -H
      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      apc999   12713  0.0  0.0  59732  1684 pts/24   Ss   15:11   0:00 -tcsh
      apc999   12839  0.0  0.0  74864  2080 pts/24   R+   15:20   0:00   ps ux -H
      apc999   12637  0.0  0.0  59732  1684 pts/10   Ss   15:07   0:00 -tcsh
      apc999   12760  0.1  0.0  24412  2052 pts/10   S+   15:13   0:00   top
      apc999   12821  0.0  0.0  66196  1144 ?        Ss   15:16   0:00 SCREEN top
      apc999   12822  0.1  0.0  24416  2048 pts/27   Ss+  15:16   0:00   top
      
    参数
    • u 显示进程的用户名
    • x 显示当前用户的所有进程(包括当前用户的其他终端)
    • -A (-e)显示所有进程(包括其他用户)
    • -U Username指定特定用户

  • screen 是一个窗口管理工具帮助你保持一个session在主机上的运行而不受外界因素影响.比如你ssh到一台主机上运行一个程序foo,当你ssh中断的时候, 这个程序foo的运行也将中断.为了让foo的运行不受ssh的影响,screen可以助你一臂之力.这里link是我写的比较详细的介绍
下载

  • wget其实是强大的下载/抓站工具,默认支持断点续传
    实例
    • 例1:将http://www.example.com/packages/foo.bar 下回来
      wget -r -c http://www.example.com/packages/foo.bar
    • 例2:将http://www.example.com/packages/ 下后缀为zip的文件(不包括子目录中的)全部下回来
      wget -r -np -nd -A.zip http://www.example.com/packages/
      把example.html中所有链接的zip文件下载回来, 只往下找一层
      wget -r -l1 -np -nd -A.zip http://www.example.com/example.html
    • 例3:下载urls.txt 中所有url:
      wget -i urls.txt
    参数
    • -r: 递归下载。如果是http的url,下载http文件当中超链接所引用的url;如果是ftp,下载目录(如同cp 或者scp 的-r参数)
    • -c: 指定断点续传。wget默认选项,只有该文件之前被其它ftp工具所下的时候才有用。
    • -np/-nd: 不在远端遍历父目录/不在本地建立目录结构
    • -l: 递归级数(配合-r使用)
    • -i --input-file: 下载在FILE文件中出现的URLs
    • -t: 重试次数
    • -A, --accept=LIST: 分号分隔的被接受扩展名的列表
    • -R, --reject=LIST: 分号分隔的不被接受的扩展名的列表

  • curl:一个利用URL语法在命令行下工作的文件下载或上传的工具
    实例
    • 例1:将http://www.example.com/packages/foo.bar 下回来,另存为a.bar
      curl -o a.bar http://www.example.com/packages/foo.bar
    • 例2:批量下载
      curl http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html \
        -o "archive#1_vol#2_part#3.html"
      
标准输入输出上的文本处理

  • grep
    实例
    • 例1: 查找当前目录下所有文件(recursively)是否包含某一个正则表达式reg_exp,忽略大小写
      $grep -rin reg_exp *
    • 例2: 查找当前目录下所有以foo为extension的文件
      $grep -r --include "*.foo" reg_exp *
    • 例3: 显示匹配行以及上下两行的内容
      $grep -2 reg_exp *
    参数
    • -?: 显示匹配行的上下?行
    • -r: recursive 递归查找
    • -i: ignore case 不敏感大小写
    • --include: filename pattern 根据给定文件名pattern过滤
    • -n: line number 显示行号

  • awk: 在输入的文件或字符串中, 基于给定的规则提取文本.基本用法 awk 'pattern {action}'
    实例
    • 例1:将文件A.txt当中每行用,分割为若干个字段,输出第3个字段
      $awk -F "," '{print $3}' A.txt
    • 例2:检查哪个用户没有设立password
      $awk -F: '$2=="" {printf("%s no password!\n",$1)}' /etc/passwd
    • 例3:统计当前目录下所有.dat文件一共多大(对输入的某一列求和)
      $ls -l *.dat | awk '{ SUM += $5} END { print SUM/1024/1024 }' 
    参数
    • -F: 分割符
    • $1: 得到的第一个字段
    • $NF: 最后一个字段

  • cut: 和awk有一些类似,但用法比awk简单
    实例
    • 例1:将文件/etc/passwd当中每行用:分割为若干个字段,输出第1和第7个字段
      cut -d : -f 1,7 /etc/passwd
    参数
    • -b list: list指定第几第几个byte位置
    • -c list: list指定第几第几个字符位置
    • -f list: list指定第几第几个field位置

  • head/tail: head用来 显示一个文件开头部分, tail 显示一个文件结尾部分
    实例
    • 显示foo.txt的前100行
      head -n 100 foo.txt
    • 显示foo.txt的最后100个byte
      tail -c 100 foo.txt
    参数
    • -n: 行数
    • -c: 字节数
    • -f: 不结束, 不停刷新显示

  • tee: 很有用的小命令--把标准输出的内容复制到制定文件当中
    实例:
    • ls并把显示内容复制到ls_result 这个文件中。
      ls * | tee -a ls_result

  • uniq: 报告或者忽略输入中重复的行
    实例
    • 查看输入中有多少不同内容的行,以及每一行出现的次数
      cat foo | sort | uniq -c

  • diff: 比较两个文件或者目录下的不同
    用来比较两个目录(以及子目录)下文件的不同
    $ diff -r /path1/foo /path2/foo

  • hexdump: 报告或者忽略输入中重复的行
    实例
    • 把二进制文件foo按照16进制字符输出
      $ hexdump  foo 
      0000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00
      0000010 12 00 00 00 d8 08 00 00 85 00 20 00 00 00 00 00
      0000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45
      ...
用户相关的操作

  • adduser: 添加用户
    增加用户foo
    $ sudo adduser foo
    把用户foo添加到admin当中(可以sudo)
    $ sudo adduser foo admin

  • groups:查看某个用户所属的组
其他操作

  • time: 给命令计时. 注意有时候shell自带的time功能较弱,要用/usr/bin/time
    实例
    • 给命令cmd计时
      /usr/bin/time -f "%E" cmd arg1 arg2 

1 comment:

Anonymous said...

hmm.. thanks for post ))