• 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


    http://www.wklken.me/posts/2013/07/04/note-of-linux-shell-scripting-cookbook.html#




  • 相关阅读:
    龙井和碧螺春的功效与作用
    064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法
    063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法
    062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用
    061 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 08 一维数组总结
    060 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 07 冒泡排序
    059 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 06 增强型for循环
    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值
    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
    056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用
  • 原文地址:https://www.cnblogs.com/chenshoubiao/p/4774120.html
Copyright © 2020-2023  润新知