• Linux shell速查手册


    Linux Shell脚本攻略笔记[速查]

    Linux Shell脚本攻略的笔记,markdown编写,可以速查(ctrl+f)

    2013-09-08 从历史网摘中补充 2014-02-16 增加<<shell脚本指南>>笔记补充


    资源

    sed简明教程

    awk简明教程


    shell script

    #!/bin/bash
    # do something
    

    run shell script

    sh script.sh
    
    or
    
    chmod a+x script.sh
    ./script.sh
    # 会读取首行的解释器, 执行
    

    cmd

    cmd1; cmd2
    
    or
    
    cmd1
    cmd2
    

    echo

    echo 的功能正如其名,就是基于标准输出打印一段文本

    echo "welcome to bash"
    echo welcome to bash
    

    使用不带引号的echo时,无法显示分号

    使用单引号echo时,bash不会对单引号中变量求值 '$var'

    echo 中转义换行符

    默认情况,echo将换行标志追加到文本尾部,可以忽略结尾换行符

    echo -n 'test
    '
    

    对字符串进行转义

    echo -e '1	2	3'
    

    打印彩色输出

    文字颜色码
        重置0
        黑色30
        红色31
        绿色32
        黄色33
        蓝色34
        洋红35
        青色36
        白色37
    
    echo -e "e[1;31m This is red test e[0m"
    
    背景颜色码
        重置0
        黑色40
        红色41
        绿色42
        黄色43
        蓝色44
        洋红45
        青色46
        白色47
    
    echo -e "e[1;42m Green Background e[0m"
    

    printf

    可以格式化字符串, 使用参数同c中printf一样

    printf "hello world"
    

    默认不会加换行符, 需要手动添加

    printf "%-5s %-10s %-4.2f
    " 3 Jeff 77.564
    
    3    Jeff      77.56
    

    环境变量和变量

    bash中,每个变量的值都是字符串,无论你给变量赋值时是否使用引号,值都会以字符串的形式存储

    环境变量

    查看所有与此终端进程相关的环境变量

    env
    

    查看某个进程的环境变量

    cat /proc/$PID/environ
    

    变量赋值

    var=value
    var='the value'
    var="the $PARAM"
    
    echo $var
    echo ${var}
    
    var = value非变量赋值是相等操作
    

    环境变量

    未在当前进程中定义,而是从父进程中继承而来的变量
    export 设置环境变量,之后,从当前shell 执行的任何程序都会继承这个变量
    
    export PYTHONPATH=$PYTHONPATH:/home/ken/workspace
    

    常用的环境变量

    PATH 查找可执行文件路径, 通常定义在/etc/environment or /ect/profile or ~/.bashrc
    修改:        export PATH=$PATH:/new/path/
    HOME
    PWD
    USER
    UID
    SHELL
    

    获取字符串长度

    length=${#var}
    

    识别当前shell版本

    echo $SHELL
        /bin/bash
    echo $0
        bash
    

    检查是否为超级用户 or 普通用户

    root的UID=0
    
    if [ $UID -ne 0 ]
    then
        echo "not root user"
    else
        echo "root"
    fi
    

    修改bash的提示字符

    设置PS1变量
    u用户名
    h主机名
    w当前工作目录
    

    pgrep

    获取某个进程名对应进程id

    pgrep gedit
    

    shell数学运算

    整数运算

    let

    no1=4
    no2=5
    let result=no1+no2
    
    let no1++
    let no2--
    let no1+=7
    let no2-=7
    

    expr(少用)

    result=`expr 3 + 4`
    result=$(expr $no1 + 5)
    

    其他方法

    result=$[ no1 + no2 ]
    result=$[ $no + 5 ]
    
    result=$(( no1 + 5 ))
    

    浮点数

    echo "4 * 0.56" | bc
    设定精度
    echo "scale=2;3/8" | bc
    进制转换
    echo "obase=2;100" | bc
    平方
    echo "10^10" | bc
    平方根
    echo "sqrt(100)" | bc
    

    命令状态

    当命令成功完成, 返回0

    发生错误并退回, 返回非0

    可以从$?中获取 cmd; echo $?

    文件描述符和重定向

    文件描述符: 与文件输入/输出相关联的整数, 用来跟踪已打开的文件

    0 stdin  标砖输入
    1 stdout 标准输出
    2 stderr 标准错误
    

    重定向到文件

    清空文件写入新内容
    echo "test" > temp.txt
    追加
    echo "test" >> temp.txt
    
    >等价于1>
    >>等价于 1>>
    

    输出分离或合并

    分离
    cmd 2>stderr.txt  1>stdout.txt
    
    合并
    cmd > output.txt 2>&1
    or
    cmd &> output.txt
    

    扔到垃圾桶

    /dev/null 特殊设备文件, 接收到的任何数据都会被丢弃(位桶/黑洞)
    
    只有标准错误
    cmd 2 > /dev/null
    
    标准输出和标准错误
    cmd >/dev/null 2>&1
    

    同时输出到终端和文件

    cmd | tee file1
    
    tee默认覆盖,可以-a选项追加
    cmd | tee -a file1
    

    将stdin作为命令参数

    cmd1 | cmd2 | cmd3 -
    

    将文件重定向到命令

    cmd < file
    

    自定义文件描述符

    使用文件描述符3打开并读取文件
    exec 3<input.txt
    cat <&3
    
    使用文件描述符4进行写入
    exec 4>output.txt
    echo newline >&4
    

    cat

    cat, concatenate(拼接)

    “cat”代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容

    一般格式

    cat file1 file2 file3
    
    从管道中读取
    OUTPUT_FROM_SOME_CMDS | cat
    
    echo "test" | cat - file1
    

    压缩空白行, 多个连续空行变成单个

    cat -s  file
    

    配合tr移除空白行

    cat file | tr -s '
    ' #连续多个
     -> 
    
    

    加行号

    cat -n file
    

    显示制表符等

    cat -T file
    
    cat f > t
    注意:“>>”和“>”调用了追加符号。它们用来追加到文件里,而不是显示在标准输出上。
    “>”符号会删除已存在的文件,然后创建一个新的文件。
    所以因为安全的原因,建议使用“>>”,它会写入到文件中,而不是覆盖或者删除。
    

    输入多行文字(CTRL + d 退出)

    cat > test.txt
    

    数组和关联数组

    普通数组,整数作为数组索引, 借助索引将多个独立的数据存储为一个集合(list)

    关联数组,可以使用字符串作为索引(map)

    数组

    定义

    array_var=(1 2 3 4 5)
    
    or
    array_var[0]="test1"
    array_var[3]="test3"
    

    读取

    echo ${array_var[0]}
    

    以清单形式打印

    echo ${array_var[*]}
    echo ${array_var[@]}
    

    长度

    echo ${#array_var[*]}
    

    获取索引列表

    echo ${!array_var[*]}
    

    关联数组

    declare -A ass_array
    
    内嵌索引-值
    ass_array=([index1]=value1 [index2]=value2)
    
    独立
    ass_array[index3]=value3
    
    echo ${ass_array[index1]}
    

    alias

    alias是一个系统自建的shell命令,允许你为名字比较长的或者经常使用的命令指定别名。

    alias new_command='command seq'
    unalias new_command
    
    使用原生命令
    
    ew_command
    

    date

    “date”命令使用标准的输出打印当前的日期和时间,也可以深入设置

    读取日期

    date
    

    时间戳

    date +%s
    

    日期转换为时间戳

    date --date "Thu Nov 18 08:07:21 IST 2010" +%s
    

    日期格式化

    星期  %a  Sat
          %A  Saturday
    月    %b  Nov
          %B  November
    日    %d  31
    固定日期格式mm/dd/yy     %D
    年    %y  10
          %Y  2010
    小时  %I/%H    08
    分钟  %M  33
    秒    %S  10
    纳秒  %N  696308515
    Unix纪元时  %s
    

    格式化

    date "+%Y %B %d"
    
    date +%Y-%m-%d
    输出: 2011-07-28
    date +"%Y-%m-%d %H:%M:%S"
    

    设置日期和时间

    date -s "格式化日期字符串"
    
    date -s "21 June 2009 11:01:22"
    

    延时

    sleep number_of_seconds
    

    两天后及两天前

    date -d '2 days' +%Y%m%d
    date -d '2 days ago' +%Y%m%d
    

    某一天的几天前

    TODAY=`date +%Y%m%d`
    DAY_1_AGO=`date -d "$TODAY 1 days ago" +%Y%m%d`
    

    时间戳日期转换

    date -d @1193144433
    date -d @1193144433 "+%Y-%m-%d %T"
    
    反向:
    date -d "2007-10-23 15:00:23" "+%s"
    

    赋值给变量

    DATE=$(date +%Y%m%d)
    DATE=`date +%Y%m%d`
    

    调试脚本

    打印出所执行的每一行命令

    bash -x script.sh
    sh -x script.sh
    

    在脚本中设置开关

    set -x 在执行时显示参数和命令
    set +x 关闭调试
    set -v 当命令进行读取时显示输入
    set +v 禁止打印输入
    

    直接修改脚本

    #!/bin/bash -xv
    

    函数和参数

    定义函数

    function fname()
    {
        statements;
    }
    or
    fname()
    {
        statements;
    }
    

    调用

    fname;
    传参
    fname arg1 arg2;
    

    接收参数

    $1第一个参数
    $2第二个参数
    $nn个参数
    
    "$@"被扩展成 "$1" "$2" "$3"
    "$*"扩展成"$1c$2c$3", 其中cIFS第一个字符
    
    "$@"使用最多, $*将所有的参数当做单个字符串
    

    bash支持递归

    导出函数,可以作用到子进程中

    export -f fname
    

    函数及命令返回值

    cmd;
    echo $?
    
    退出状态,成功退出,状态为0,否则,非0
    
    cmd
    if [ $? -eq 0 ]
    then
        echo "success"
    else
        echo "fail"
    fi
    

    管道

    前一个命令的输出作为后一个命令的输入

    $cmd1 | cmd2 | cmd3
    

    读取命令输出

    子shell  subshell
    cmd_output=$(COMMANDS)
    or
    反引用
    cmd_output=`COMMANDS`
    

    子shell本身是独立进程, 不会对当前shell有任何影响

    pwd;
    (cd /bin; ls)
    pwd #同上一个pwd
    

    保留空格和换行符

    out=$(cat text.txt)
    echo $out  #丢失所有换行符
    
    out="$(cat text.txt)"
    echo $out  #保留
    
    cat a
    1
    2
    3
    echo $(cat a)
    1 2 3
    echo "$(cat a)"
    1
    2
    3
    

    read

    read, 用于从键盘或标准输入中读取文本

    读取n个字符存入变量

    read -n number_of_chars variable_name
    

    不回显的方式读取密码

    read -s var
    

    显示提示信息

    read -p "Enter input:" var
    

    限时输入

    read -t  timeout var
    

    设置界定符

    read -d delim_char var
    read -d ":" var
    hello:
    

    字段分隔符和迭代器

    内部字段分隔符,Internal Field Separator, IFS

    IFS默认为空白字符(换行符,制表符,空格)

    data="name,sex,rollno"
    oldIFS=$IFS
    IFS=,
    for item in $data
    do
            echo $item
    done
    
    IFS=$oldIFS
    

    循环

    for循环

    echo {1..50}
    
    for i in {a..z}; do actions; done;
    
    or
    
    for((i=0;i<10;i++))
    {
        commands;
    }
    

    while循环

    while condition
    do
        commands;
    done
    

    until循环

    until condition
    do
        commands;
    done
    

    比较和测试

    if条件

    if condition;
    then
        commands;
    elif condition;
    then
        commands;
    else
        commands;
    fi
    

    逻辑运算符进行简化, 短路运算更简洁

    [ condition ] && action;
    [ condition ] || action;
    

    算术比较

    -gt 大于
    -lt 小于
    -ge 大于等于
    -le 小于等于
    -ne 不等于
    -eq 等于
    
    注意[]和操作数之间的空格
    [ $var -eq 0 ]
    
    and
    [ $var -ne 0 -a $var2 -ge 2 ]
    or
    [ $var -ne 0 -o $var2 -ge 2 ]
    

    文件测试

    [ -f $file_var ] 正常文件路径或文件名
    [ -x $var ] 可执行
    -d 目录
    -e 存在
    -c 字符设备文件
    -b 块设备文件
    -w 可写
    -r 可读
    -L 符号链接
    

    字符串比较

    [[ $str1 = $str2 ]]
    [[ $str1 == $str2 ]]
    
    [[ $str1 != $str2 ]] 不等
    
    [[ $str1 > $str2 ]]
    [[ $str1 < $str2 ]]
    
    [[ -z $str1 ]]  
    [[ -n $str1 ]]  非空
    
    if [[ -n $str1 ]] && [[ -z $str2 ]]
    then
        commands;
    fi
    

    find

    搜索指定目录下的文件,从开始于父目录,然后搜索子目录

    基本

    find base_path
    
    # 打印文件和目录列表
    find . -print  #默认
    分割文件名
    

    文件名

    find path -name "*.txt" -print
              -iname  忽略大小写
    
    多个条件 or
    find . ( -name "*.txt" -o -name "*.py" )
    

    文件路径

    通配符
    find /home/users -path "*slynux*" -print
    
    正则
    find . -regex ".*(.py|.sh)$"
           -iregex 忽略大小写
    

    否定参数

    find . ! -name "*.txt" -print
    

    根据文件类型

    find . -type d -print
    f 普通文件
    l 符号链接
    d 目录
    c 字符设备
    b 块设备
    s 套接字
    p Fifo
    

    设定目录深度

    find . -maxdepth 1 -type f -print
    find . -mindepth 2 -type f -print
    

    根据文件时间搜索

    计量单位 天
    -atime 最近一次访问时间
    -mtime 最后一次被修改时间
    -ctime 文件元数据,最近一次修改时间
    
    find . -type f -atime -7 -print #最近七天内被访问的
    find . -type f -atime 7 -print  #恰好在七天前
                          +7 -print #超过七天
    
    计量单位 分钟
    -amin 访问时间
    -mmin 修改时间
    -cmin 变化时间
    
    find . -type f -amin +7 -print #访问时间超过7分钟的
    
    find . -type f -newer file.txt -print  #用于比较时间戳的参考文件,比参考文件更新的文件
    

    基于文件大小的搜索

    find . -type f -size +2k
    + 大于  -小于   无符号,恰好等于
    
    b 块
    c 字节
    w 字(2字节)
    k 千字节
    M 兆字节
    G 吉字节
    

    删除匹配的文件

    find . -type f -name "*.swp" -delete
    #注意:-delete位置一定是最后
    

    文件权限及所有权

    find . -type f -perm 644 -print
    
    find . -type f -user slynux -print
    

    执行命令或动作(最强大的命令)

    find . -type f -user root -exec chown slynux {} ;
    find . -type f -exec cp {} OLD ;
    find . -iname "abc.txt" -exec md5sum {} ;
    
    {} 江北替换成对应文件名
    exec无法结合多个命令,可以将多个命令放入脚本,调用之
    

    跳过指定目录

    find . ( -name ".git" -prune ) -name '*.txt'
    

    xargs

    将标准输入数据转化成命令行参数

    将stdin接收到的数据重新格式化,再将其作为参数传给其他命令

    多行输入转化成单行输出

    cat  example.txt | xargs  #空格替换掉
    
    

    切成多行,每行n个参数

    cat examplet.txt | xargs -n 3
    

    可以指定分隔符

    echo "aaaXbbbXccc" | xargs -d 'X'
    

    将参数传递给脚本(类似循环)

    cat args.txt | xargs -n 1 ./cecho.sh
    
    ./cecho.sh -p arg1 1
    需要变更
    cat args.txt | xargs -I {} ./cecho.sh -p {} 1
    

    find与xargs组合

    find . -type f -name "*.txt" -print | xargs rm -rf
    

    其他

    cat file | ( while read arg; do cat $arg; done )
    cat file | xargs -I {} cat {}
    

    tr

    tr可以对来自标准输入的字符进行替换,删除以及压缩(translate, 可以将一组字符变成另一组字符)

    tr只能通过stdin,无法通过其他命令行进行接收参数

    格式

    tr [options] source-char-set replace-char-set
    

    选项

    -c 取source-char-set补集,通常与-d/-s配合
    -d 删除字source-char-set中的所列的字符
    -s 浓缩重复字符,连续多个变成一个
    

    字符替换

    cat /proc/12501/environ | tr '' '
    '
    

    大小写替换

    echo  "HELLO" | tr 'A-Z' 'a-z'
    cat text | tr '	' ' '
    

    删除字符

    echo "hello 123 world 456"| tr -d '0-9'
    hello  world
    

    字符集补集

    echo "hello 1 char 2" | tr -d -c '0-9'  #删除非0-9
    12
    

    压缩字符

    连续的重复字符

    echo "GNU is    not UNix" | tr -s ' '
    

    字符类

    alnum 字母和数字
    alpha 字母
    cntrl 控制字符
    digit 数字
    graph 图形字符
    lower 小写字母
    print 可打印字符
    punct 标点符号
    space 空白字符
    upper 大写字母
    xdigit 十六进制字符
    
    tr '[:lower:]' '[:upper:]'
    

    md5sum

    32个字符的十六进制串

    md5sum filename
    md5sum filename1 filename2
    

    sha1sum

    40个字符十六进制串

    sha1sum file
    

    对目录进行校验

    需安装md5deep软件包

    md5deep/sha1deep
    md5deep -rl dirname
             r递归,l相对路径
    

    sort

    语法

    sort [options] [file(s)]
    
    -c 检查是否已排序
    -u 丢弃所有具有相同键值的记录
    
    -b 忽略开头空白
    -d 字典序
    -g 一般数值,以浮点数类型比较字段,仅支持gnu
    -i 忽略无法打印的字符
    
    -k 定义排序键值字段
    -n 以整数类型比较字段
    -r 倒转
    -o 输出到指定文件
    

    排序

    sort file1 > file1.sorted
    sort -o file1.sored file1
    

    按数字, 要明确

    sort -n file1
    

    逆序

    sort -r file
    

    测试一个文件是否已经被排过序

    sort -C file
    if [ $? -eq 0 ]; then
        echo ssss
    fi
    

    合并两个排过序的文件,并不需要对合并后的文件进行再排序

    sort -m sorted1 sorted2
    

    根据键或者列排序(按照哪一个列)

    sort -k 1 data
    

    限定特定范围内一组字符

    key=char4-char8
    sort -k 2,3 data
    
    sort -k2.4,5.6 file
    第二个字段的第四个字符开始比较,直到第五个字段的第六个字符
    

    忽略前导空白及字典序排序

    sort -bd unsorted.txt
    

    去重

    sort a.txt | uniq
    sort -u a.txt
    

    uniq

    用法

    uniq file
    

    只显示未重复的记录

    uniq -u file
    

    找出重复的行

    uniq -d file
    -s 可指定跳过前N个字符
    -w 指定用于比较的最大字符数
    

    统计各行出现的次数

    uniq -c file
    

    p57

    tempfile

    只有在基于Debian的发布版才有(Ubuntu/Debian)

    temp_file=$(tempfile)
    等同
    temp_file="/tmp/file-$RANDOM"
    
    #$$为进程id
    temp_file="/tmp/var.$$"
    

    split

    按大小分割文件, 单位k(KB), M, G, c(byte), w(word)

    split -b 10k data.file
    

    -d数字后缀,-a后缀长度

    split -b 10k data.file -d -a 4
    

    分割后指定文件名前缀

    split -b 10k data.file file_prefix
    
    设置后缀格式
    split -b 10k data.file -d -a 4 file_prefix
    

    根据行数分割

    spilt -l 10 data
    

    其扩展是csplit,可根据文件特性切分,关注

    bash变量匹配切分

    sample.jpg

    file_jpg="sample.jpg"
    
    从右向左匹配
    ${file_jpg%.*}
    #sample
    
    从左向右匹配
    ${file_jpg#.*}
    #jpg
    
    % # 属于非贪婪
    %% ## 属于贪婪
    

    贪婪非贪婪

    var=hack.fun.book.txt
    ${var%.*} #hack.fun.book
    ${var%%.*} #hack
    
    ${var#.*} #fun.book.txt
    ${var##.*} #txt
    

    expect

    实现自动化

    spawn ./ineractive.sh
    expect "Enter the number"
    send "1
    "
    expect "Enter name:"
    send "hello
    "
    expect eof
    
    spawn指定需要自动化的命令
    expect提供需要等待的消息
    send发送消息
    expect eof指明命令交互结束
    

    dd

    生成任意大小的文件

    # 创建一个1M大小的文件junk.data
    bs=2M count=2 则文件大小4M
    
    dd if=/dev/zero of=junk.data bs=1M count=1
       输入文件     输出文件     块大小   复制块数
    
    块大小单位
    字节(1B) c
    字(2B)   w
    块(512B)   b
    千字节(1024B) k
    兆字节(1024KB) M
    吉字节(1024MB) G
    

    comm

    两个文件之间比较,输出三列

    onleA 	 onlyB 	 bothAB
    
    comm A B -1 -2 #删除第一第二列
    -3 删除第三列
    
    可以得到A^B  A-B B-A
    

    mkdir

    “mkdir”(Make directory)命令在命名路径下创建新的目录。然而如果目录已经存在了,那么它就会返回一个错误信息”不能创建文件夹,文件夹已经存在了”(“cannot create folder, folder already exists”)

    mkdir dirpath
    
    mkdir -p dirpath1/dirpath2
    
    #一次多个目录
    mkdir -p /home/user/{test,test1,test2}
    

    注意:目录只能在用户拥有写权限的目录下才能创建

    ls

    ls命令是列出目录内容(List Directory Contents)的意思。运行它就是列出文件夹里的内容,可能是文件也可能是文件夹

    ls文件的内容关系

    - 普通文件
    d 目录
    c 字符设备
    b 块设备
    l 符号链接
    s 套接字
    p 管道
    
    文件权限序列
    rwx
    rwS  setuid(S),特殊权限, 出现在x的位置, 允许用户以其拥有者的权限来执行文件, 即使这个可执行文件是由其他用户运行的
    
    目录
    r,允许读取目录中文件和子目录列表
    w,允许在目录中创建或删除文件或目录
    x,指明是否可以访问目录中的文件和子目录
    rwt/rwT 粘滞位,只有创建该目录的用户才能删除目录中的文件,即使用户组和其他用户也有写权限,典型例子/tmp, 写保护
    

    查看目录

    ls -d */
    ls -F | grep "/$"
    ls -l | grep "^d"
    find . -type d -maxdepth 1 -print
    

    其他

    ls -l    命令已详情模式(long listing fashion)列出文件夹的内容
    ls -a    命令会列出文件夹里的所有内容,包括以”.”开头的隐藏文件
    

    chmod

    设置文件权限

    “chmod”命令就是改变文件的模式位。chmod会根据要求的模式来改变每个所给的文件,文件夹,脚本等等的文件模式(权限)。

    设置权限

    user group others all
    u    g     o      a
    
    chmod u=rwx g=rw o=r filename
    
    chmod u+x filename
    chomd a+x filename #所有
    
    chmod a-x filename
    
    chmod 764 filename
    
    #设置粘滞位
    chmod a+t dirname
    
    #递归改变
    
    chmod 777 . -R
    

    注意:对于系统管理员和用户来说,这个命令是最有用的命令之一了。在多用户环境或者服务器上,对于某个用户,如果设置了文件不可访问,那么这个命令就可以解决,如果设置了错误的权限,那么也就提供了为授权的访问。

    chown

    每个文件都属于一个用户组和一个用户“chown”命令用来改变文件的所有权,所以仅仅用来管理和提供文件的用户和用户组授权。

    改变所有权

    chown user.group filename
    

    递归

    chown -R user.group .
    

    每次都以其他用户身份执行(允许其他用户以文件所有者的身份来执行)

    chomod +s executable_file
    
    chown root.root executable_file
    chmod +s executable_file
    ./executable_file
    

    chattr

    创建不可修改文件

    chattr +i file
    

    一旦被设置为不可修改, 任何用户包括超级用户都不能删除该文件, 除非其不可修改的属性被移除

    chattr -i file
    

    touch

    “touch”命令代表了将文件的访问和修改时间更新为当前时间。

    touch命令只会在文件不存在的时候才会创建它(空白文件)。如果文件已经存在了,它会更新时间戳,但是并不会改变文件的内容。

    空白文件

    touch filename
    
    for name {1..100}.txt
    do
        touch $name
    done
    

    修改文件访问时间

    touch -a "Fri Jun 25 20:50:14 IST 1999" filename
    touch -m #修改文件内容的修改时间
    

    修改文件或目录的时间戳(YYMMDDhhmm)

    touch -t 0712250000 file
    

    注意:touch 可以用来在用户拥有写权限的目录下创建不存在的文件。

    ln

    建立软连接

    ln -s target symbolic_link_name
    

    如果目的路径已经存在,而没有指定 -f 标志,ln 命令不会创建新的链接,而是向标准错误写一条诊断消息并继续链接剩下的 SourceFiles。

    -f 促使 ln 命令替换掉任何已经存在的目的路径

    读取链接对应真是路径

    readlink web
    
     readlink ~/.vim
     /Users/ken/github/k-vim
    

    file

    通过查看文件内容来找出特定类型的文件

    打印文件类型信息

    file filename
    

    打印不包含文件名在内

    file -b filename
    

    e.g.

    file /etc/passwd
    /etc/passwd: ASCII English text
    
    file -b /etc/passwd
    ASCII English text
    

    读文件

    while read line;
    do
        something
    done < filename
    

    diff

    生成文件差异

    非一体化

    diff version1.txt version2.txt
    

    一体化, 可读性更好

    diff -u version.txt
    

    使用patch将命令应用于任意一个文件

    diff -u version1.txt version2.txt > version.patch
    patch -p1 version1.txt < version.patch
    

    递归作用于目录

    diff -Naur directory1 directory2
    
    -N 所有缺失的文件作为空文件
    -a 所有文件视为文本文件
    -u 一体化输出
    -r 递归遍历
    

    前10行打印

    head file
    

    前n行

    head -n 4 file
    

    扣除最后N行之外的所有行

    head -n -5 file
    

    tail

    最后10行

    tail file
    

    打印最后五行

    tail -n 5 file
    tail -5 file
    

    扣除前n行

    tail -n +(N+1)
    

    实时动态打印

    tail -f growing_file
    

    当某个给定进程结束后, tail随之终结

    tail -f file --PID $PID
    

    pushd/popd

    将当前路径压入栈

    pushd
    

    压入某个路径

    pushd /home/ken
    

    查看当前路径列表

    dirs
    

    切换到某一个

    #dirs从左到右编号 0 -
    pushd +3
    

    移除最近压入栈的路径并切换到下一个目录

    popd
    

    cd

    经常使用的“cd”命令代表了改变目录。它在终端中改变工作目录来执行,复制,移动,读,写等等操作

    切换到上一目录

    cd -
    

    会到HOME目录

    cd
    cd ~
    

    会到上一级目录

    cd ..
    

    wc

    Word Count

    统计行数

    wc -l file
    

    统计单词数

    wc -w file
    

    统计字符数

    wc -c file
    

    统计所有

    wc file
    

    统计最长行的长度

    wc file -L
    

    tree

    以图形化的树状结构打印文件和目录的结构,需要自行安装

    tree ~/unixfile
    

    重点标记出匹配某种样式的文件

    tree PATH -P "*.sh"
    

    只标记符合样式之外的文件

    tree path -I PATTERN
    

    同时打印文件和目录大小

    tree -h
    

    grep

    文本搜索工具, 支持正则表达式和通配符

    ‘grep‘命令搜索指定文件中包含给定字符串或者单词的行

    基本用法

    grep "match_pattern" file1 file2
    

    使用颜色重点标记

    grep word filename --color=auto
    

    扩展型使用正则

    grep -E "[a-z]+"
    egrep "[a-z]+"
    

    只输出匹配到的文本部分

    grep -o word filename
    

    除匹配行外的所有行

    grep -v word filename
    

    统计匹配行数

    grep -c 'text' filename
    

    打印出包含匹配字符串的行数

    grep linux -n filename
    

    打印样式匹配所位于的字符或字节的偏移

    echo "gnu is not unix" | grep -b -o "not"
    

    搜索多个文件,找出匹配文本位于哪个文件中

    grep -l linux file1 file2
    取反
    grep -L
    

    递归搜索目录

    grep -R "text" dir
    

    忽略大小写

    grep -i "hello" filename
    

    匹配多个样式

    grep -e "pattern1" -e "pattern2" file
    

    运行匹配脚本

    grep -f pattern_file source_file
    
    pattern_file:
    hello
    cool
    

    在搜索中包含、排除文件

    grep --include *.{c,cpp} word file
    

    排除

    grep --exclude "Readme" filename
    --exclude-dir
    

    静默输出,用于判断(不会产生任何输出)

    grep -q word file
    if [ $? -eq 0 ]
    

    打印匹配行之前,之后的行

    grep -A 3 之后3行
    grep -B 3 之前
    grep -C 3 前后
    

    使用行缓冲

    在使用tail -f命令时是可以及时看到文件的变化的,但是如果再加上一个grep命令,可能看到的就不那么及时了,
    因为grep命令在buffer写不满时就不输出,可以通过选项  --line-buffered 来搞定,如:
    
    tail -f file.txt | grep something  --line-buffered
    

    cut

    语法

    cut -c list [ file ... ]
    cut -f list [ -d delim ] [ file ...]
    
    -c list 以字符为主,作剪切操作
    -f list 以字段为主,作剪切操作
    

    提取字段或列

    #第一列
    cut -f1 filenam
    
    #第二三列
    cut -f2,3 filename
    

    提取补集

    cut -f1 --complement filename
    

    指定字段分隔符

    cut -d ";" -f2 filename
    cut -d : -f 1,5 /etc/passwd
    

    指定字符

    -b 字节
    -c 字符
    -f 字段
    
    cut -c1-5 filename
    N-
    N-M
    -M
    
    ls -l | cut -c 1-10
    

    指定输出分隔符

    cut -c1-3,6-9 --output-delimiter ","
    

    join

    语法

    join [options] file1 file2
    
    选项
    -1 field1
    -2 field2
    -o file.field
    -t separator
    

    例子

    join file1 file2
    

    sed

    sed(Stream editor)流编辑器, 可以配合正则使用, 进行替换等

    sed替换语法

    sed 's/pattern/replace_string/' file
    

    将结果直接运用于源文件

    -i 用于, 直接修改源文件
    
    替换第一个
    sed -i 's/pattern/replace_string/' file
    
    替换第二个
    sed -i 's/pattern/replace_string/2' file
    
    替换所有
    sed -i 's/pattern/replace_string/g' file
    
    从第N处开始替换
    sed -i 's/pattern/replcae_string/2g' file
    

    移除空白行

    sed '/^$/d' file
    

    已匹配字符串标记

    引用匹配到的
    sed 's/w+/[&]/g' filename
    

    组合多个表达式

    sed 'exp1' | sed 'exp2'
    等价
    sed 'exp1;exp2'
    

    使用引用

    sed "s/$text/HELLO/"
    

    子串匹配标记(后向引用,最多9个)

    sed 's/([a-z]+)' ([A-Z]+)/2 1/' filename
    

    保存到文件

    sed 's/pattern/replacement/' -i outfile
    

    使用其他分隔符

    sed 's#/home/#/tmp/#'
    

    awk

    基本结构

    awk -F '-' 'BEGIN{statements} {statements} END{statements}' file
    表达式中单引号可以换成双引号
    BEGIN -> 每一行,执行statements, 执行END
    

    打印某一列

    awk -F '-' '{print $0}' file #全部
    awk -F '-' '{print $2}' file #第二列
    

    print拼接字符

    awk '{var="v1"; var1="v2"; print var1"-"var2;}'
    

    特殊变量

    NR nuber of records, 记录数
    NF number of fields, 字段数
    $0 当前行文本
    $1 第一字段
    $2 第二字段
    $NF 最后一个字段
    
    FILENAME 当前输入文件的名称
    FNR 当前输入文件记录数
    FS 字段分隔字符
    OFS 输出字段分隔符,默认" "
    ORS 输出记录分隔符,默认"
    "
    

    统计行数

    awk 'END{print NF}'
    

    将外部变量值传递给awk

    awk -v VARIABLE=$VAR '{ print VARIABLE }'
    awk '{print v1, v2}' v1=$var1 v2=$var2
    

    读取行

    seq 5 | awk '{ getline var; print var}'
    

    进行行过滤

    awk 'NR<5' #行号小于5
    awk 'NR==1,NR==4' #行号在1到5之间
    awk '/linux/' #包含样式linux
    awk '!/linux/' #不包含
    awk '$1 ~/jones/' #第一个字段包含jones
    
    tail file
    awk 'NR <= 10' file
    

    设定分隔符

    awk -F: '{ print $NF }' file
    

    设定输出分隔符

    awk -F: -v "OFS=-" '{print $1,$2}' /etc/passwd
    

    打印空行

    awk 'NF>0 {print $0}'
    or
    awk 'NF>0' #未指定action默认打印
    

    print和printf

    awk -F: '{print "User", $1, "is really", $5}' /etc/passwd
    awk -F: '{printf "User %s is really %s
    ", $1, $5}' /etc/passwd
    

    awk中使用循环

    for(i=0;i<10;i++) { print $i; }
    
    for(i in array) { print array[i] }
    

    内建函数

    length(str)
    index(str,search_str)
    split(str,array,delimiter) 用界定符生成一个字符串列表
    substr(string, start, end) #子串
    sub(regex, replacement_str, str) #正则替换首个匹配位置
    gsub(regex, replacement_str, string) #最后一个匹配位置
    match(string, regex) #检查是否能够匹配字符串
    tolower(string) #转小写
    toupper(string) #转大写
    

    写成脚本文件

    BEGIN {}
    pattern1 {action1}
    pattern2 {action2}
    END {}
    

    文件迭代

    读文件行

    while read line;
    do
        echo $line;
    done < file.txt
    

    迭代每个单词

    for word in $line;
    do
        echo $word;
    done
    

    迭代每一个字符

    for((i=0;i<${#word};i++))
    do
        echo ${word:i:1} ;
    done
    

    paste

    按列合并文件

    paste file1 file2 file3
    

    指定分隔符

    paste file1 file2 -d ','
    

    tac

    逆序打印

    tac file1 file2
    

    rev

    接收一个文件或stdin作为输入, 逆序打印每一行内容

    echo "abc" | rev
    

    wget

    Wget是用于非交互式(例如后台)下载文件的免费工具.支持HTTP, HTTPS, FTP协议和 HTTP 代理(选项多, 用法灵活)

    一个用于文件下载的命令行工具

    wget URL1 URL2
    

    指定保存文件名

    wget URL -O local.txt
    

    指定日志,默认达到stdout

    wget URL -O local.txt -o log.txt
    

    指定重复尝试次数

    wget -t 5 URL
    

    下载限速

    wget --limit-rate 20k url
    

    指定限额

    wget -Q 100m url
    

    断点续传

    wget -c URL
    
    $ wget -c -t 100 -T 120 http://www.linux.com/xxxx.data
    
    当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。
    wget的断点续传是自动的。
    -c 选项的作用为断点续传。
    -t 参数表示重试次数(例如重试100次,-t 100,如果设成-t 0,表示无穷次重试,直到连接成功)
    -T 参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时
    

    复制或镜像整个网站

    wget --mirror exampledomain.com
    wget -r -N -l DEPTH URL
         递归,允许对文件使用时间戳,层级
    $ wget -r -np -nd http://www.linux.com/packs/
    
    -np 的作用是不遍历父目录
    -nd 表示不在本机重新创建目录结构
    

    访问需要认证的HTTP/FTP

    wget --user username --password pass URL
    

    post请求

    wget url -post-data "name=value" -O output.html
    

    批量下载

    wget -i downloads.txt #将文件地址写入一个文件
    

    用wget命令执行ftp下载

    wget -m ftp://username:password@hostname
    

    curl

    基本用法

    curl url > index.html
    

    不显示进度信息

    curl URL --slient
    

    将内容写入文件,而非标准输出

    curl URL --slient -O
    

    写入指定文件

    curl URL --slient -o filename
    

    显示进度条

    curl url -o index.html --progress
    

    断点续传

    curl -C - URL
    

    设置参照页字符串

    curl --referer Referer_URL target_URL
    跳转到target_URL,其头部referer为Referer_URL
    

    设置cookie

    curl url --cookie "user=slynux;pass=hack"
    另存为一个文件
    
    curl URL --cookie-jar cookie_file
    

    设置用户代理

    curl URL --user-agent "Mozilla/5.0"
    头部信息
    curl -H "Host: www.slynux.org" -H "Accept-language: en" url
    

    限定下载带宽

    curl url --limit-rate 20k
    

    指定最大下载量(可下载的最大文件大小)

    curl url --max-filesize bytes
    超出限制的话,返回非0
    

    进行认证

    curl -u user:pass url
    

    只打印头部信息,不下载远程文件

    curl -I url
    curl -head url
    

    发送post请求

    curl URL -d "va1=1&va2=2"
             --data
    

    lynx

    将网页以ascii字符形式下载

    lynx -dump URL > webpage_as_text.txt
    

    打印出网站的文本板块而非html

    lynx -dump url
    

    生成信息文件

    lynx -traversal url
    

    tar

    “tar”命令是磁带归档(Tape Archive),对创建一些文件的的归档和它们的解压很有用。

    将多个文件和文件夹保存成单个文件, 同时还能保留所有的文件属性

    对文件进行归档

    -c create file,创建文件
    -f specify filename,指定文件名
    
    tar -cf output.tar file1 file2 file3
    tar -cf output.tar *.txt
    
    tar -cvf output.tar *.txt
    

    向归档中追加文件

    tar -rvf original.tar new_file
    -r,追加
    

    查看过程中更多信息

    tar -tvvf archive.tar
    -v/-vv, verbose
    

    提取文件或文件夹

    -x, exact
    tar -xf archive.tar
    
    -C,指定文件
    tar -xf archive.tar -C /path/to/extraction_directory
    
    
    tar -xvf archive.tar
    

    提取指定文件

    tar -xvf file.tar file1 file4
    

    拼接两个归档文件

    tar -Af file1.tar file2.tar
    #file2合并到file1中
    

    只有在文件内容修改时间更新(newer),才进行添加

    tar -uvvf archive.tar filea
    

    比较归档文件与文件系统中的内容

    tar -df archive.tar filename1 filename2
    

    从归档文件中删除文件

    tar -f archive.tar --delete file1 file2
    

    提取到某个目录

     tar zxvf package.tar.gz -C new_dir
    

    压缩归档文件

    gzip/gunzip -> .gz
    f.tar.gz   -z
    tar -czvf 
    tar -xzvf
    
    bzip/bunzip -> .bz2
    f.tar.bz2  -j
    
    f.tar.lzma --lzma
    f.tar.lzo
    

    从归档中排除部分文件

    tar -cf arch.tar * --exclude "*.txt"
    cat list
       filea
       fileb
    tar -cf arch.tar * -X list
    

    排除版本控制文件

    tar --exclude-vcs -czvvf source.tar.gz files
    

    打印总字节数

    tar -cf arc.tar * --exclude "*.txt" --totals
    

    cpio

    使用频率不高

    归档,保留文件属性(权限、所有权等)

    echo file1 file2 | cpio -ov > archive.cpio
    -o 指定输出
    -v 打印归档文件列表
    

    列出cpio中的文件内容

    cpio -it < archive.cpio
    -i指定输入
    -t列出归档文件中的内容
    

    gzip

    压缩,会删除源文件

    gzip filename
    #got filename.gz
    

    解压

    gunzip filename.gz
    

    列出文件属性信息

    gzip -l text.gz
    

    stdin读入文件并写出到stdout

    cat file | gzip -c > file.gz
    

    压缩归档文件

    tar -czvvf archive.tar.gz [files]
    or
    tar -cvvf archive.tar.gz [files]
    gzip archive.tar
    

    指定压缩率

    1-9,1最低,但速度最快
    gzip -9 test.img
    

    zcat

    无需解压缩,直接从.gz中提取内容

    zcat test.gz
    

    bzip

    更大的压缩率

    bzip2 filename
    

    解压缩

    bunzip2 filename.bz2
    

    stdin到stdout

    cat file > bzip2 -c > file.tar.bz2
    

    压缩归档

    tar -cjvvf archive.tar.bz2 [files]
    or
    tar -cvvf archive.tar [files]
    bzip2 archive.tar
    

    保留输入文件

    bunzip2 test.bz2 -k
    

    压缩率

    bzip2 -9 test.img
    

    lzma

    比gzip/bzip2更好的压缩率

    压缩

    lzma filename
    

    解压

    unlzma filename.lzma
    

    stdin到stdout

    cat file | lzma -c > file.lzma
    

    创建归档

    tar -cavvf archive.tar.lzma [files]
        -xavf
    

    保留输入文件

    lzma test.bz2 -k
    

    压缩率

    lzma -9 test.img
    

    zip

    压缩

    zip archive_name.zip [source files/dirs]
    

    对目录和文件进行递归操作

    zip -r archive.zip folder1 file2
    

    base64

    编码

    base64 filename > outfile
    cat file | base64 > outfile
    

    解码

    base64 -d file > outfile
    

    md5sum

    “md5sum”就是计算和检验MD5信息签名。md5 checksum(通常叫做哈希)使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。

    单向散列

    md5sum file
    sha1sum file
    

    rsync

    可以对位于不同位置的文件和目录进行备份, 借助差异计算和压缩技术实现最小化数据传输量

    要确保远端安装了 openssh

    从一个目录复制到另一个目录

    rsync -av source_path dest_path
    -a 进行归档  -v打印细节
    路径可以使本地,也可以是远端路径
    
    e.g.
    rsync -av /home/test /home/backups/ #复制到backups目录下
    rsync -av /home/test /home/backups  #创建backups目录, 复制
    

    备份到远程服务器

    rsync -av source_path user@host:PATH
    可以反向
    

    改善传输速度

    rsync -avz source destination
    

    排除文件

    rsync -avz source dest --exclude "*.txt"
                           --exclude-from FILEPATH
    FILEPATH:
    *.bak
    

    更新备份时,删除不存在的文件

    rsync -avz source dest --delete
    

    git

    初始化目录

    git init
    

    配置用户信息

    git config --global user.name "wklken"
    git config --global user.email "wklken@yeah.net"
    

    加到远端

    git remote add origin user@remotehost:/home/backup/backup.git
    git push origin master
    

    添加

    git add *
    

    删除

    git rm *.py
    

    标记一个检查点

    git commit -m "Commit message"
    

    查看日志

    git log
    

    回滚到某个版本

    git checkout hashid [ filename ]
    

    克隆

    git clone url
    

    dd

    Dtat Definiton, 要注意参数顺序, 错误的参数会损毁所有数据

    可以用来转换和复制文件,大多数时间是用来复制iso文件(或任何其它文件)到一个usb设备(或任何其它地方)中去,所以可以用来制作USB启动器

    语法说明

    dd if=SOURCE of=TARGET bs=BLOCK_SIZE count=COUNT
    if/of  输入/输出文件或设备路径
    bs块大小
    count 限制复制到目标的字节数
    
    dd if=/dev/zero of=/dev/sda1
    
    #制作iso 从cdrom设备读取所有数据, 创建iso文件
    dd if=/dev/cdrom of=cdrom.iso
    

    备份恢复

    dd if=/dev/sda1 of=x.img
    
    dd if=x.img of=/dev/sda1
    

    mount

    mount 是一个很重要的命令,用来挂载不能自动挂载的文件系统。你需要root权限挂载设备。在插入你的文件系统后,

    mount --bind /source /destination
    
    首先运行”lsblk”命令,识别出你的设备,然后把分配的设备名记下来。
    root@tecmint:~# lsblk
    创建一个任何名字的目录,但是最好和引用相关。
    
    root@tecmint:~# su
    Password:
    root@tecmint:~# cd /dev
    root@tecmint:~# mkdir usb
    现在将“sdb1”文件系统挂载到“usb”目录.
    root@tecmint:~# mount /dev/sdb1 /dev/usb
    

    挂载镜像

    mount -o loop file.img /mnt/mount_point
    

    网络相关

    ifconfig

    显示网络接口、子网掩码等详细信息

    ifconfig
    /sbin/ifconfig
    

    打印某个特定网络接口

    ifconfig iface_name
    
    e.g.
    ifconfig en1
    
    HWaddr     MAC地址
    inet addr  ip地址
    Bcast      广播地址
    Mask       子网掩码
    

    设置网络接口ip

    ifconfig wlan0 192.168.0.80
    

    dns

    cat /etc/resolv.conf
    
    host google.com #Dns查找
    
    nslookup google.com #更详细信息
    

    修改dns/host

    echo nameserver IP_ADDRESS >> /etc/resolv.conf
    
    echo ip domain >> /etc/hosts
    

    ping

    ping www.baidu.com
    

    路由信息

    显示路由表
    route
    
    以数字形式显示地址
    route -n
    

    设置默认网关

    route add default gw 192.168.0.1 wlan0
    

    trace_route, 显示分组途径的所有网关的地址

    traceroute google.com
    

    ping

    基本

    ping ADDRESS  #主机名,域名或ip
    

    PING命令可以得到RTT(Round Trip Time), 分组从源到目的主机的往返时间, 单位ms

    限制发送分组数

    ping ADDRESS -c COUNT
    
    ping
    

    fping

    同时ping一组ip, 而且响应非常快

    fping -a ip1 ip2 -g
    fping -a 192.160.1/24 -g
    fping -a < ip.list
    
    -a, 所有活动主机的ip
    -g, 从IP/mask生成的ip地址范围
    

    进行dns查询

    fping -a -d 2 > /dev/null  < ip.list
    

    lftp

    基本用法

    lftp username@ftphost
    cd dir
    lcd改变本地主机目录
    mkdir 创建目录
    get/put 下载上传
    quit退出
    

    scp

    scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。

    linux的scp命令可以在linux服务器之间复制文件和目录.

    拷贝文件

    scp filename user@remotehost:/home/pat
    ip或主机名均可
    
    scp SOURCE DESTINATION
    

    递归复制

    scp -r dir1 user@remotehost:/home/backup
    

    提高拷贝速度

    scp  -c arcfour -r -P20755 dir/ 192.168.2.*:/**/**/data/
    -c arcfour 这个算法没有加校验不保证完整性,注意慎用,内网1000M带宽,默认算法速度只能达到30M/s,用arcfour这个算法速度可以达到50-80M/s
    

    SSH

    连接远程

    ssh username@remote_host
    
    ssh -p port username@remote_host
    

    执行命令

    ssh username@remote_host 'cmd1; cmd2' > stdout.txt 2>errors.txt
    

    压缩功能

    ssh -C user@hostname 'cmds'
    

    打通ssh

    1.创建SSH密钥
      ssh-keygen -t rsa
      公钥, ~/.ssh/id_rsa.pub
    2.登陆远端服务器, 将公钥写入 ~/.ssh/authorized_keys
    

    lsof

    列出系统中开放端口及运行在端口上的服务

    lsof -i
    

    配合grep, 获取需要的信息

    netstat

    查看开放端口和服务

    netstat -tnp
    

    磁盘和系统

    du

    du = disk usage

    估计文件的空间占用。 逐层统计文件(例如以递归方式)并输出摘要。

    查看占用磁盘空间

    du FILENAME1 FILENAME2
    

    查看目录

    du -a dir
    

    以KB,MB或块为单位展示

    du -h FILENAME1
    

    显示总计情况

    du -c FILENAME1
    

    只显示合计

    du -s FILENAME1
    

    以特定单位打印

    du -b/-k/-m/-B FILES
    

    排除部分文件

    du --exclude "*.txt" DIR
       --exclude-from EXCLUDE.txt DIR
    

    指定最深层级

    du --max-depth 2 DIR
    

    指定目录最大的10个文件

    du -ak S_DIR | sort -nrk 1 | head
    

    df

    df = disk free

    报告系统的磁盘使用情况。在跟踪磁盘使用情况方面对于普通用户和系统管理员都很有用。 ‘df‘ 通过检查目录大小工作,但这一数值仅当文件关闭时才得到更新。

    查看磁盘可用空间

    df
    df -h
    

    time

    计算命令执行时间

    time COMMAND
    
    real 挂钟时间, 从开始执行到结束的时间
    user 进程花费在用户模式中的cpu时间, 真正用于执行进程所花得时间
    sys  进程花费在内核模式中的cpu时间
    

    写入文件

    time -o output.txt COMMAND
    time -a output.txt COMMAND #追加
    

    格式化输出

    time -f "Time: %U"  -a -o timing.log uname
    real %e
    user %U
    sys %S
    

    who

    获取当前用户登陆信息

    who / w
    

    当前登陆主机的用户列表

    users
    

    uptime

    查看系统已经通电运行多长时间了

    uptime
    #也可以看到负载
    

    last

    显示上次用户登录信息- 前一次启动会话信息

    last
    

    获取单个用户

    last USER
    

    watch

    在终端中以固定间隔监视命令输出

    #default 2s
    watch ls
    
    # 5s
    watch -n 5 ls
    

    颜色标示

    watch -d 'COMMAND'
    

    进程和线程

    ps

    ps命令给出正在运行的某个进程的状态,每个进程有特定的id成为PID。

    ps命令主要查看系统中进程的状态

    USER              PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
    USER表示启动进程用户
    PID表示进程标志号
    
    %CPU表示运行该进程占用CPU的时间与该进程总的运行时间的比例
    %MEM表示该进程占用内存和总内存的比例。
    
    VSZ表示占用的虚拟内存大小,以KB为单位。
    RSS为进程占用的物理内存值,以KB为单位。
    
    TTY表示该进程建立时所对应的终端,"?"表示该进程不占用终端。
    STAT表示进程的运行状态,包括以下几种代码:
        D,不可中断的睡眠;
        R,就绪(在可运行队列中);
        S,睡眠;
        T,被跟踪或停止;
        Z,终止(僵死)的进程,Z不存在,但暂时无法消除;
        W,没有足够的内存分页可分配;<高优先序的进程;
        N,低优先序的进程;
        L,有内存分页分配并锁在内存体内(实时系统或I/O)。
    
    START为进程开始时间。
    TIME为执行的时间。
    COMMAND是对应的命令名。
    

    查看进程信息

    #当前终端
    ps
    
    PID TTY TIME CMD
    PID  进程ID
    TTY  终端
    TIME 进程启动后过去的时间
    CMD  进程对应的命令
    

    显示更多信息

    #当前终端
    ps -f
    

    查看所有进程

    ps aux
    ps -ef
    

    查看某个用户的所有进程

    ps U ken
    

    命令格式

    ps [OTHER OPTIONS] -o par1,par2,par3
    ps -eo comm,pcpu | head
    pmem 内存使用率,comm可执行文件名,user启动进程的用户,etime启动后度过的时间
    

    设置升序降序

    ps -eo comm,pcpu --sort -pcpu | head
    +升序,-降序
    

    找出给定命令名对应进程ID

    ps -C COMMAND_NAME
    ps -C bash -o pid=
    

    进程线程相关

    ps -eLf --sort -nlwp | head
    

    查看子进程树

    ps axwef
    

    注意:当你要知道有哪些进程在运行或者需要知道想杀死的进程PID时ps命令很管用。你可以把它与‘grep‘合用来查询指定的输出结果,例如:

    # ps -A | grep -i ssh
    

    pgrep

    pgrep只需要命令名的一部分, ps需要准确的全名

    基本用法

    pgrep bash
    

    指定进程的用户

    pgrep -u root,slynux COMMAND
    

    返回匹配进程数

    pgrep -c COMANND
    

    top

    查看占用cpu最多的进程列表

    top
    

    kill

    kill是用来杀死已经无关紧要或者没有响应的进程,杀死一个进程需要知道进程的PID

    列出可用信号

    kill -l
    

    终止一个进程

    kill PROCESS_ID_LIST
    

    强杀进程

    kill -9 PROCESS_ID
    

    杀死一组命令

    killall process_name
    killall -9 process_name
    
    指定用户
    killall -u USERNAME process_name
    

    pkill

    杀,接受进程名

    pkill process_name
    pkill -s SIGNAL process_name
    

    which

    查找PATH下某个命令位置

    which ls
    

    whereis

    whereis的作用是用来定位命令的二进制文件资源或者帮助页.举例来说,获得ls和kill命令的二进制文件/资源以及帮助页:

    whereis ls
    whereis kill
    

    类似which,多了命令手册位置,源代码位置

    注意:当需要知道二进制文件保存位置时有用.

    file

    确定文件类型

    whatis

    对命令的简短描述

    hostname

    当前主机名

    uname

    主机名
    uname -n
    
    #内核版本,硬件架构等
    uname -a
    
    #内核发行版本
    uname -r
    
    主机类型(32位/64位)
    uname -m
    
    cpu相关信息
    cat /proc/cpuinfo
    
    内存信息
    cat /proc/meminfo
    

    例子

    #uname -a
    Linux tecmint 3.8.0-19-generic #30-Ubuntu SMP Wed May 1 16:36:13 UTC 2013 i686 i686 i686 GNU/Linux
    
    1. “Linux“: 机器的内核名
    2. “tecmint“: 机器的分支名
    3. “3.8.0-19-generic“: 内核发布版本
    4. “#30-Ubuntu SMP“: 内核版本
    5. “i686“: 处理器架构
    6. “GNU/Linux“: 操作系统名
    

    crontab

    格式

    * * * * * cmd
    分钟(0-59),小时(0-23),天(1-31),月份(1-12),工作日(0-6)
    
    A,B  A and B
    */C  every C
    

    查看

    crontab -l
    crontab -l -u slynux
    

    编辑

    crontab -e
    

    移除

    crontab -r
    crontab -u slynux -r
    

    可以在crontab 中加入环境变量

    getopts

    命令行参数处理

    while getopts :f:vql opt
    do
        case $opt in
        f)  file=$OPTARG
            ;;
        v)  verbose=true
            ;;
        ....
    

    history

    “history”命令就是历史记录。它显示了在终端中所执行过的所有命令的历史

    history
    

    注意:按住“CTRL + R”就可以搜索已经执行过的命令,它可以你写命令时自动补全

    sudo

    “sudo”(super user do)命令允许授权用户执行超级用户或者其它用户的命令。通过在sudoers列表的安全策略来指定。

    注意:sudo 允许用户借用超级用户的权限,然而”su”命令实际上是允许用户以超级用户登录。所以sudo比su更安全。并不建议使用sudo或者su来处理日常用途,因为它可能导致严重的错误如果你意外的做错了事,这就是为什么在linux社区流行一句话:

    “To err is human, but to really foul up everything, you need root password.”“人非圣贤孰能无过,但是拥有root密码就真的万劫不复了。”

    cal

    “cal”(Calender),它用来显示当前月份或者未来或者过去任何年份中的月份

    cal
    cal 02 1835
    

    cp

    “copy”就是复制。它会从一个地方复制一个文件到另外一个地方

    cp file1 file2
    cp -r dir1 dir2
    

    快速备份一个文件:

    cp some_file_name{,.bkp}
    

    注意: cp,在shell脚本中是最常用的一个命令,而且它可以使用通配符(在前面一块中有所描述),来定制所需的文件的复制。

    mv

    “mv”命令将一个地方的文件移动到另外一个地方去。

    “mv”命令将一个地方的文件移动到另外一个地方去。

    pwd

    “pwd”(print working directory),在终端中显示当前工作目录的全路径。

    注意: 这个命令并不会在脚本中经常使用,但是对于新手,当从连接到nux很久后在终端中迷失了路径,这绝对是救命稻草。

    free

    free -m
                 total       used       free     shared    buffers     cached
    Mem:          7982       6811       1171          0        350       5114
    -/+ buffers/cache:       1346       6636
    Swap:        16935         11      16924
    

    显示剩余内存

    free -m | grep cache | awk '/[0-9]/{ print $4" MB" }'
    

    在这里例子中,应用程序只使用了1346MB内存,还有6636MB空闲内存可以使用.

    一些简单的计算方法:

    物理已用内存 = 实际已用内存 - 缓冲 - 缓存 = 6811M - 350M - 5114M

    物理空闲内存 = 总物理内存 - 实际已用内存 + 缓冲 + 缓存

    应用程序可用空闲内存 = 总物理内存 - 实际已用内存

    应用程序已用内存 = 实际已用内存 - 缓冲 - 缓存

    原始解释:转至互联网:Linux的基本原则是没有资源应该被浪费.因此核心会使用尽可能多的RAM,来缓存来自本地和远程的文件系统的信息.系统做读写操作的时候,会将与当前运行的进程相关的数据尽量存储在RAM里.系统报告的缓存是缓冲和页缓存两者之和.缓存并不是在进程结束的时候被回收(你可能很快会启动另外一个进程,需要同样的数据),而是随需回收–比如,当你启动一个需要大量内存的进程时,Linux核心会从内存中回收缓存,将得到的内存分配给新的进程.

    有些区域,比如匿名内存映射(mmps)和共享内存区域,它们被报告为缓存,但不是被核心直接释放.一般的缓存不映射到进程的地址空间,仅仅是简单的核心映射,而这些特别的缓存映射到所有挂接到它们上面的进程.

    eval

    eval "ls -l"
    

    basename

    获取路径中文件部分

    basename resolv.conf #resolv.conf
    basename /etc/resolv.conf # resolv.conf
    

    cmp

    比较两个任意类型的文件并将结果输出至标准输出。如果两个文件相同, ‘cmp‘默认返回0;如果不同,将显示不同的字节数和第一处不同的位置。

    cmp file1 file2
    diff file1 file2
    

    rm

    ‘rm’ 标准移除命令。 rm 可以用来删除文件和目录

    rm file1
    rm -r dir1  #递归删除空目录
    

    强删

    rm -rf fileordir
    

    警告: ”rm -rf” 命令是一个破坏性的命令,假如你不小心删除一个错误的目录。一旦你使用’rm -rf’ 删除一个目录,在目录中所有的文件包括目录本身会被永久的删除,所以使用这个命令要非常小心。

    service

    ‘service‘命令控制服务的启动、停止和重启,它让你能够不重启整个系统就可以让配置生效以开启、停止或者重启某个服务。

    注意:要想使用service命令,进程的脚本必须放在‘/etc/init.d‘,并且路径必须在指定的位置。如果要运行“service apache2 start”实际上实在执行“service /etc/init.d/apache2 start”.

    man

    ‘man‘是系统帮助页。Man提供命令所有选项及用法的在线文档。几乎所有的命令都有它们的帮助页

    man thecommand
    

    注意:系统帮助页是为了命令的使用和学习而设计的。

    passwd

    这是一个很重要的命令,在终端中用来改变自己密码很有用。显然的,因为安全的原因,你需要知道当前的密码。

    gcc

    gcc 是Linux环境下C语言的内建编译器。下面是一个简单的C程序,在桌面上保存为Hello.c (记住必须要有‘.c‘扩展名

    gcc Hello.c
    ./a.out
    gcc -o Hello Hello.c
    ./Hello
    

    注意: 编译C程序时,输出会自动保存到一个名为“a.out”的新文件,因此每次编译C程序 “a.out”都会被修改。因此编译期间最好定义输出文件名.,这样就不会有覆盖输出文件的风险了。

    g++

    g++是C++的内建编译器

    g++ Add.cpp
    ./a.out
    g++ -o Add Add.cpp
    ./Add
    

    java

    Java 是世界上使用最广泛的编程语言之一. 它也被认为是高效, 安全和可靠的编程语言. 现在大多数基于网络的服务都使用Java实现.

    javac tecmint.java
    java tecmint
    

    注意: 几乎所有的Linux发行版都带有gcc编译器, 大多数发行版都内建了g++ 和 java 编译器, 有些也可能没有. 你可以用apt 或 yum 安装需要的包.

    关于/dev/null

    特别有用的特殊文件,位桶,传送到此文件的数据都会被系统丢弃。

    语言及乱码

    查看变量值

    echo $LANG   未设置任何LC_XXX时使用的默认值
    echo $LC_ALL 覆盖所有LC_XXX变量,总控开关
    

    好的做法是,避免为任何LC_XXX变量赋值,使用LC_ALL和LANG来控制

    避免乱码:从编辑器到语言,再到系统,统一编码为UTF-8

    shell的版本

    bash --version
    
  • 相关阅读:
    【区间DP&&记忆化搜索】乘法游戏
    洛谷P1608路径统计
    2021省选游记
    涂色计划P4170
    01迷宫及路径记录(DFS&&BFS)
    [YBTOJ递推算法强化训练4]序列个数
    C++关于string 的优先队列以及重载运算符
    浅谈C++STL容器
    集合的划分
    图的表示
  • 原文地址:https://www.cnblogs.com/double12gzh/p/10166257.html
Copyright © 2020-2023  润新知