linuxshell 脚本攻略读书笔记

linux shell脚本攻略这是一本值得推荐的书,下面是我的一些阅读笔记与大家分享,欢迎大家指教交流。
----------------------------------------2017/08/21---------------------------------------------------    
normal array:
    echo -n 'test': 忽略行尾的换行符
    echo -e '1\t2\t3\t': 引号内的转义字符有效,不加 -e 则直接原样打印出引号内的内容。

echo array=(0 1 2 3 4 5 6 7 8 9)    # 定义一个数组
echo ${array[2]}                    # 打印数组第三个元素
index=5;echo ${array[index]}        #
echo ${#array[*]}                   # 打印数组元素的个数
echo ${array[*]}                    # 打印数组内的所有元素

关联数组:
    可以使用任意文本作为文件索引。
        定义关联数组: declare -A fruit_array
                      fruit_array=([apple]="10 RMB" [orange]="20 RMB")
echo "the apple cost is ${fruit_array[apple]}"
        列出关联数组的索引号: echo ${!fruit_array[*]} 或者 echo ${!fruit_array[@]}

read:获取用户输入
    read test; ... ; echo $test

tput:终端处理工具
    tput cols;tput lines : 显示行数和列数
    tput longname : 显示终端名
    tput cup 100 100 : 移动光标到(100,100)位置
    tput setb no : 设置终端背景色

###############################################
#!/bin/bash
#filename: test_tput_sleep.sh
echo -n count: # -e 参数 删除 count 后的换行符
tput sc        # 存储光标位置

count=0;       
while true;
do
    if [ $count -lt 40 ]; # -lt : less than 小于
    then let count++;     # let 数学运算
        sleep 1;          # 
        tput rc;          # 恢复光标位置
        tput ed;          # 清楚当前光标位置到行尾之间的内容 
        echo -n $count;
    else exit 0;
    fi
done
###############################################

fork炸弹: :(){:|:&};:

cat -n: 添加行号
echo %?    #获取函数或命令的返回值

read    #接收用户输入
        read -n 5 var;echo $var    # read -n numbers_char variable_name    按nubers_char判断是否结束输入
        read -s var;echo $var      #不显示输入的字符
        read -p "Enter Name:" name #显示提示信息
        read -t timeout var    #限时输入,在timeout时间内有效
        read -d delim_charvar   # 自定义定界符以作为输入结束符

IFS 定界符,默认定界符位换行、制表、空格(可用于分割字符串)
        #####################################################################
                data='name,number,sex,location'
                oldIFS=$IFS
                IFS=,
                for item in $data;
                do
                echo item: $item
                done

                IFS=$oldIFS

        #####################################################################

          #function.sh fun_IFS()函数

echo {1..50}     #生成数字列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
echo {a..z}      #生成字母列表
a b c d e f g h i j k l m n o p q r s t u v w x y z

for 循环
######################################################
         for var in list; 
         do 
         commands;
         done
                                       # list can be a string or sequence.

        ####### THE Second method ####### 
         for((i=0;i<10;i++))
         {
             commands;
         }
######################################################

while 循环
######################################################
        while condition
        do
        commands;
        done
######################################################

until 循环
######################################################
         x=0;
         until [ $x -eq 9 ];   #[ $x -eq 9 ] is condition
         do
         let x++;
         echo $x;
         done
######################################################

比较与测试
######################################################
   if/if else
         if condition;
         then
         commands;
         fi

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

######################################################

使用逻辑运算符进行判断
######################################################
      &&: 逻辑与; ||: 逻辑或
             [ condition ] && action;    #如果condition为真,则执行action
             [ condition ] || action;    #如果condition为假,则执行action
######################################################

算术比较
######################################################
        -gt: 大于
        -lt: 小于
        -ge: 大于等于
        -le: 小于等于
        -ne: 不等于

         [ $var -eq 0 -a $var2 -gt 2 ] # -a 逻辑与
         [ $var -ne 0 -o $var2 -gt 2 ] # -o 逻辑或
######################################################

文件判断标志
######################################################
    [ -f $file_var ] #若给定的变量包含正常的文件路径或文件名,则为真
    [ -x $var ]      #若给定的变量包含的文件可执行,则为真
    [ -d $var ]      #若给定的变量是目录,则为真
    [ -e $var ]      #若给定的变量包含的文件存在,则为真
    [ -c $var ]      #若给定的变量是一个字符设备文件的路径,则为真
    [ -b $var ]      #若给定的变量是一个块符设备文件的路径,则为真
    [ -w $var ]      #若给定的变量包含的文件可写,则为真
    [ -r $var ]      #若给定的变量包含的文件可读,则为真
    [ -L $var ]      #若给定的变量包含的是一个符号链接,则为真

                fpath='/etc/passwd'
                if [ -e $fpath ]; then
                echo 'file exists';
                else
                echo 'file not exists';
                fi 
######################################################

字符串比较
######################################################
    注意:使用双中括号
            [[ $str1 == $str2 ]] # str1 str2 相等时为真
            [[ $str1 != $str2 ]] # str1 str2 不等时为真
            [[ $str1 > $str2 ]]  # str1 大于 str2 时为真
            [[ $str1 < $str2 ]]  # str1 小于 str2 时为真
            [[ -z $str1 ]]       # 若 str1 为空字符串串,则为真
            [[ -n $str1 ]]       # 若 str1 为非空字符串,则为真
######################################################

test 用于条件检测:
        if [ $var -eq 0 ]; then echo 'TRUE'; fi
        if test $var -eq 0 ; then echo 'TRUE'; fi 
        #两者等同

cat 可以指定分隔符,默认为 \t  -s file # 将多个空行压缩成单个
cat -T file # 将制符表打印出来
cat -n file # 打印行号
cat learnShell.note | tr -s '\n' # 移除空白行后打印出来

录制与回放终端会话: script/scriptreplay
        script -t 2> timing.log -a output.session
        >typre commands;
        >....
        >....
        >exit

        scriptreplay timing.log output.session

find 命令:
    -name: 按文件名查找; -inane: 不区分大小写
    find ~ -name '*.txt'  # 查找 ~ 目录下的所有 txt 文件
    find ~ -iname '*.txt' # iname 查找时不区分大小写
    find ~ \( -name '*.txt' -o -name '*.pdf' \) # 查找 ~ 目录下的 txt 和 pdf 文件 

    -path: 可以对路径进行匹配
    find ~ -path '*vim*' # 查找 ~ 目录下所有含 vim 的路径 

    -regex: 基于正则表达式对文件路径进行匹配; -iregex: 不区分大小写
    find ~ -regex ".*\(\.py\|\.sh\)$" # 查找 ~ 目录下所有的 py 和 sh 文件

    !: 含否定的参数
    find ~ ! -name '*.txt' # 查找 ~ 下所有不是以 txt 结尾的文件

    -maxdepth/-mindepth: # 按目录深度查找

    -type: # 按文件类型查找
        f   普通文件
        l   链接文件
        d   目录
        c   字符设备
        b   块设备
        s   套接字
        p   Fifo

    -atime: 用户最近一次访问文件的时间
    -mtime: 文件内容最后一次被修改的时间
    -ctime: 文件元数据(权限或者所有权)最后一次改动的时间
        -atime/-mtime/-ctime 单位都是天; -amin/mmin/cmin 单位都是分钟
    -/+: - 表示小于; + 表示大于
    eg: find ~ -type f -atime -7 # 查找 ~ 目录下最近7天访问的文件

    -size: 按文件大小查找
    find ~ -type f -size +2k   # b: 块(512字节); c: 字节; w: 字; k: 千字节; M: 兆; G

    -delete: 删除匹配的文件
    find ~ -type f -name "*.swp" -delete

    -perm: 按文件权限查找
    find ~ -type f -perm 644 # 查找 ~ 目录下权限为644的普通文件

    -user: 按用户名查找
    find ~ -type f -user sdgl 

    -exec: 可执行相关命令
    find ~ -type f -user root -exec chown sdgl {} \; # {}会替换成相应的文件名,查找 ~ 目录下所有者为 root 的文件,并更改其所有权限为 sdgl
    find ~ -type f -name '*.c' -exec cat {} \;>all_c_files.txt
    find ~ -type f -mtime +10 -exec cp {} OLD \;

----------------------------------------2017/08/22---------------------------------------------------    
xargs 命令:
   从 stdin 接收数据并重新格式化,将其作为其他命令的参数(将输入中的多行数据转化为单行)
        $: cat example.txt
            1 2 3 4 5 6 
            7 8 9 
            10 11 12
        $: cat example.txt | xargs
            1 2 3 4 5 6 7 8 9
    xargs -n number_chars: 将数据打印成每行 number_chars 个数据
        $: cat example.txt | xargs -n 3
            1 2 3
            4 5 6
            7 8 9
            10 11 12
    xargs -d char: 指定 char 为字符串的分割符,默认分隔符为 IFS,类似给 IFS 赋值
        $: echo '123x456x789' | xargs -d x
            123 456 789
        $: echo '123x456x789' | xargs -d x -n 2
            123 456
            789
    xargs: 为其他命令传输参数 
        $: cat args.txt | xargs -n 1 commands # 每次输入一个参数
            commands -p arg -1 # 命令参数 -p -1 固定, arg 可变
        $: cat args.txt | xargs -I {} commands -p {} -1   #  用 -I 参数,使用 {} 进行字符串替换
        $: cat args.txt | ( while read arg; do cat $arg; done )   ==  cat args.txt | xargs -I {} cat {}
    xargs -0: 以 \0 为定界符
        $: find ~ -type f -name '*.log' -print0 | xargs -0 rm -f
        $: find ~ -type f -name '*.php' -print0 | xargs -0 wc     # 打印所有 php 文件中代码的行数 

tr 命令:
    从 stdin 接收数据,进行替换、删除、以及压缩
        tr [options] set1 set2
        $: echo 'HELLO WORLD' | tr 'A-Z' 'a-z'  # 大小写替换
    tr 对数字加密和解密:
        $: echo 123456 | tr '0-9' '9876543210'     # '9876543210' 不可写成 9-0
        $: echo 'hello world, good morning' | tr 'A-Za-z' 'N-ZA-Mn-za-m'
        $: cat test | tr '\t' ' '  # 替换制符表为空格
    tr -d set 删除集合中含 set 集合相同的字符
        $: echo 'hello 123 world 456' | tr -d '0-9'
    tr -c set 定义一个补集
        $: echo 'hello 1 2 3 world, so what? ' | tr -d -c '0-9 \n'
                1 2 3
    tr -s char 压缩字符
        $: echo 'hello      world    1 2 3' | tr-s ' '
                hello world 1 2 3

校验和: md5sum 和 sha1sum
    生成校验和:
        md5sum filename >> filename_sum.md5
        sha1sum filename >> filename_sum.sha1
    验证校验和:
        md5sum -c filename_sum.md5
        sha1sum -c filename_sum.sha1

sort 命令:
        $: sort file1 file2 file3 .... >> sort_file.txt  # 对多个文件排序
        $: sort file1 file2 file3 .... -o sort_file.txt  # 对多个文件排序
        $: cat sort_file.txt | uniq > uniq_file.txt # 找出排序文件中不重复的行
        $: sort -n filename # 按数字进行排序
        $: sort -r filename # 按逆序排序
        $: sort -M months.txt # 按月份排序
        $: sort -k 1 data.txt # 按列排序        
            1 bad 1000
            2 linux 1000
            3 mac 1000
            4 winxp 2000
        $: sort -nk 1.1,1.1 data.txt # 按第1列第1个数字排序
            1568ddddd
            6548wfdsfa
            8456dfasd

var=$RANDOM # 取随机数
var=$$      # 取当前进程ID

取文件名陈或者扩展名:
    filename='file.jpg'
    name=${filename%.*} #取文件名称
    echo $name 
    extion=${filename#*.} # 取文件扩展名
    echo $extion

    string=www.baidu.com
    echo ${string%.*}      # www.baidu 
    echo ${string%%.*}     # www 
    echo ${string#*.}      # baidu.com
    echo ${string##*.}     # com 

----------------------------------------2017/08/23---------------------------------------------------    
printf 命令:类比于 c 语言
    printf "%d %d %d\n" 1 2 3

comm 命令:
    用于两个文件间的比较,可打印出两个文件的交集、差集,但用于比较的文件必须是排序过的文件
    cat A.txt
        apple
        gold
        iron
        orange
        silver
        steel
    cat B.txt
        carrot
        cookies
        gold
        orange
    comm A.txt B.txt
        apple 
                carrot
                cookies 
                        gold 
        iron
                        orange 
        silver 
        steel 
        A-B     B-A     A交B 
    -1 -2 -3 删除对应的列
    comm A.txt B.txt -1 -2 # 只打印交集
    comm A.txt B.txt -3    # 只打印不同行

3.4 查找并删除重复文件(p91)   ×××

mkdir -p /home/sdgl/test/test # 创建目录,会忽略存在的目录,同时创建缺失的目录

权限:用户、用户组、其他 (user group others)
$: ll
        -rw-r--r--  1 sdgl sdgl  3825 818 13:30 .bashrc
        drwx------ 19 sdgl sdgl  4096 821 15:08 .cache/
    第一列第一个字符:
        -   普通文件
        d   目录
        c   字符设备
        b   块设备
        l   符号链接
        s   套接字
        p   管道
    剩余9个字符,每三个一组,分别为 user group others 的读、写、执行权限

    -rwS------ : 用户执行权限还有一个 setuid(S)的特殊权限,允许用户以其拥有者的权限执行可执行文件
    ----rwS--- : 组权限没有 setuid,但有 setgid,它允许同该目录拥有者所在组权限来执行可执行文件,但是这个组和实际发起命令的组可能未必相同
    -------rwt /temp : 目录有一个特殊权限,称为粘滞位,它只允许创建该目录的用户删除其目录下的文件或目录
                        只在最后一个字符出现, t: 表示没有设置执行权限; T: 表示具有执行权限

chmod 设置文件权限:
    chmod u=rwx g=rw o=r filename
    chmod a+x filename              # 给所有用户添加执行权限
    chmod a+t dir_name              # 设置粘滞位
    chmod 777 . -R                  # 递归设置权限
    chmod +s filename               # 添加 setuid 的特殊权限
chown 更改所有权:
    chown user.group filename       # 更改文件的所有者
    chown user.group . -R           # 递归设置所有权

chattr 命令: 设置文件不可修改
    chattr +i filename # 添加不可修改属性
    chattr -i filename # 移除不可修改属性

----------------------------------------2017/08/24---------------------------------------------------    
IO 重定向:
    0-9: 系统经常使用文件描述符符号,默认 0 1 2 是开启的,类似于文件句柄, 0 标准输入; 1 标准输出; 2 错误输出
    ls /proc/self/fd 查看已开启的描述符 
         > filename:  重定向输出给 $filename 文件,当文件不存在时创建文件,当文件存在时,先清空文件 (默认的使用都是标准输出, 即 1》) 
         >> filename: 重定向输出给 $filename 文件, ... ,当文件存在时会追加到文件末尾              (1>> , 当使用 2> / 2>> ,使用的是错误输出)
         &> / &>>: 表示将标准输出和错误输出都重定向到同一文件

        grep 'hello' <filename: 重定向输入,将文件中的内容作为输入
        exec number>&- / exec number<&-: 关闭文件描述符

进程替换:
    >(commands) / <(commands)       # < 和 ( 之间没有空格
        comm <(ls -l) <(ls -al)     # 列出两个命令的不同 (ls -l 结果可能委派需)
        diff <($first_dir) <($second_dir) # 比较两个目录里的文件是否相同
        cat <(ls -l) == ls -l | cat

        ##########################################################################################################
            #!/bin/bash
            # Filename      print_file_info.sh      
            # Date:         2017/08/24
            # Fuction:      打印指定目录下文件的统计信息
            # Author:       sdgl
            if [ $# -ne 1 ]; # 判断是否传有参数 
            then
            echo $0 basepath;
            echo
            fi
            path=$1 # 获取第一个参数
            declare -A statarry;         # 定义关联数组
            while read line;
            do
            ftype=`file -b $line`; # 需用 ` 符号,不是单引号`
            let statarry[$ftype]++; # $ftype 需加引号
            #    echo $ftype ${statarry[$ftype]};
            # < <(commands) 这里第一个 < 代表输入重定向,第二个 <(commands) 表示进程替换,其功能是把一个命令的结果发送给另一个命令,类似于管道
            done< <(find $path -type f -print) # 两个小于号之间应有空格
            #echo $IFS
            #echo ${!statarry[*]} ${statarry[*]}
            # 将分界符换成 0,因为原分界符为空格,而索引内含有空格,导致无法正确取出索引
            oldIFS=$IFS
            IFS=\0
            echo ================== file types and counts ========================
            for ftype in ${!statarry[*]};
            do
            echo $ftype : ${statarry[$ftype]}
            done
            IFS=$oldIFS   # 程序结束后需恢复 IFS
        ##########################################################################################################

比较文件差异和恢复文件: (patch 命令)
    diff -u A.txt B.txt > C.patch # -u 参数,格式化输出差异文件
        A.txt
            apple 
            gold 
            iron
            orange 
            silver 
            steel 
            This is A.txt
        B.txt
            carrot
            cookies 
            gold 
            orange 
            This is B.txt
        C.patch
            --- A.txt   2017-08-24 16:44:20.829937693 +0800
            +++ B.txt   2017-08-24 16:44:33.506581545 +0800
            @@ -1,7 +1,5 @@
            -apple 
            +carrot
            +cookies 
            gold 
            -iron
            orange 
            -silver 
            -steel 
            -This is A.txt
            +This is B.txt
        patch -p1 A.txt < C.patch # 将恢复成 B.txt
        patch -p1 B.txt < C.patch # 将恢复成 A.txt

    diff -Naur dir_1 dir_2          # diff 可以对目录中的内容生成差异输出
        -N: 将缺失文件看作控文件
        -a: 将所有文件都看作文本文件
        -u: 同上
        -r: 递归,遍历目录下的所有文件

----------------------------------------2017/08/28---------------------------------------------------    
head and tail commands:
    head $filename: print the first 10 lines
    tail $filename: print the last 10 lines

    head -n $number $filename: ptint the first $number lines
    tail -n $number $filename: print the last $number lines

    head -n -N $filename: print lines except the last N lines
    tail -n +(N+1) $filename: print lines except the first N lines

    tail -f filename: -f 选项密切关注文件中新增加的内容,并随数据的增加时时保持更新
    PID=$(pidof gedit); tail -f filename --pid $PID: tail 会随着进程的结束而结束,并时时更新着进程写入的数据
    tail -f filename -s times: -s 加入时间间隔,作为监视文件更新的时间间隔

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

pushd and popd commands: 进行路径切换
    dirs: 可以查看当前栈内容
    pushd $dir: 将目录 $dir 压入栈,并切换到目录 $dir
    dirs;pushd +N: N 是要切换的目录在栈中下标(0...)
    dirs;popd  +N: 删除栈中的下标为 N 的目录(0...)

    cd -: 可以迅速在两个目录之间切换

wc commands: 统行数、单词数和字符数
    wc -l $filename: lines
    wc -w $filename: word
    wc -c $filename: char
    wc $filename -L: 打印文件中最长行的长度
    wc $filename: print l w c $filename 

tree commands: 以树形方式打印文件目录
    tree -h: 附加打印文件的大小
    tree $PATH -H http://localhost -o out.html: 以 html 的方式存储文件目录列表

seq commands: 用于产生从某一个数到另一个数之间的所有整数
    seq [para] MAX: 打印从 0-MAX 的所有整数
    seq [para] MIN MAX: 打印从 MIN-MAX 之间的所有整数
    seq [para] MIN increment MAX: seq 0 2 10: 0 2 4 6 8 10 从 MIN 开始以间隔 increment 为增量打印所有小于等于 MAX 的整数

    -f (--format): 使用 printf 相同的格式输出
    -s: 指定字符串之间的分隔符
    -w: 指定宽度,使得宽度相同哦你,不足添加 0

    $:seq -f"%3g" 9 13    # 009 010 011 012 013  (以 \n 分割)
    $:seq -f"str%03g" 9 13 # str009 str010 str011 str012 str013 (...)
    $:seq -w 99 102 # 099 100 101 102 (...)
    $:seq -s" " -f"str%03g" 9 13 # (549...) 指定分割符为空格
    $:seq -s"`echo -e '\t'`" 9 11 # 以 \t 为分隔符

正则表达式:
    ^       行起始标记
    $       行尾标记
    .       任意字符
    []      []内的任意一个字符
    [^]     除 [^] 之外的任意一个字符
    [-]     指定范围内的任意一个字符
    ?       匹配之前的项 1 次或 0次
    +       匹配之前的项 1 次或多次
    *       匹配之前的项 0 次或多次
    ()      创建一个用于匹配的字串      # max(tri)? 匹配 max 或者 maxtri
    {n}     匹配之前的项 n 次
    {n,}    匹配之前的项至少 n 次
    {n,m}   匹配之前的项至少 n 次,至多 m 次
    |       匹配 | 两边的任意一项
    \       转意字符

grep commands:
    grep $match_pattern $filename        # 打印文件中包含 $match_pattern 的行
    grep -E "[0-9]+" $filename           # -E 可以使用正则表达式作为 match_pattern 或者使用 egrep "[0-9]+" $filename 
    grep -o ...                          # -o 只打印匹配到的文本部分
    grep -v ...                          # -v 打印除匹配到的行之外的所有行
    grep -c "text" $filename             # 统计并打印文件中匹配到的字符串的行数
    grep -b -o ...                       # -b -o 打印出字符在所在行中的下标
    grep -l ...                          # -l 搜索多个文件,找到匹配字符串所在的文件;-L 返回不包含匹配字符串的文件列表
    grep $match_pattern . -R -n          # 在多级目录中对文件搜索; grep "main()" . -R -n
    grep -i ...                          # -i 忽略大小写
    grep -e $match_pattern1 -e $match_pattern2 # 可匹配多个样式
    grep -f $pattern_filename $filename  # -f 可将样式写入 $pattern_filename 文件中,再匹配
    grep "main()" . -r --include *.{c,cpp} # --include 只对当前目录下的 .c/.cpp 文件搜索,*.{c,cpp} 会扩展成 *.c / *.cpp , str{1,2,3} ===> str1,str2,str3
    grep "main()" . -r --exclude "README"  # --exclude 不对 README 文件搜索
         --exclude-dir: 可以排除目录; --exclude-from $filename: 可以排除 $filename 文件中包含的列表
    grep -q ...                          # 静默输出,不打印任何结果,只返回命令是否执行成功(0 或 非0)
    grep ... -A $N                       # 打印匹配行的后 $N 行
    grep ... -B $N                       # 打印匹配行的前 $N 行
    grep ... -C $N                       # 打印匹配行的前后 $N 行

sed commands:
    $: sed 's/pattern/replace_patt/' $filename          # 用 replace_patt 替换 pattern, 但并未修改文件
    $: sed -i ...                                       # 替换并会修改文件中的内容,只替换第一次匹配到的,余下的不匹配不替换 
    $: sed 's/pattern/replace_patt/g' $filename         # 用 replace_patt 替换 pattern, 修改文件中所有匹配的项   s/../../g
    $: sed 's/pattern/replace_patt/Ng' $filename        # 用 replace_patt 替换 pattern, 修改文件中从 N 行匹配后的所有匹配项   s/../../g
    $: sed '/^$/d' $filename                            # 删除文件中的空白行 d: 删除
    $:echo this is a digit 7 in a number | sed 's/digit \([0-9]\)/\1/'   # this is a 7 in a number 子串匹配和替换 $1 表示第一个子串,() 包裹的为子串

awk commands:
    awk 'BEGIN{ commands } { commands } END{ commands }' # 首先执行 BEGIN{}, 然后读取一行执行一次 {}, 读取结束后执行 END{},其中此三部分都是可选部分 
    awk 'BEGIN{ i=0 } { i++ } END{ print i }'
    echo | awk '{ var1='v1'; var2='v2'; var3='v3'; print var1,var2,var3 ; }' # v1 v2 v3 ; print 后的参数以逗号分割
    echo | awk '{ var1='v1'; var2='v2'; var3='v3'; print var1"-"var2"-"var3 ; }' # v1-v2-v3 ; “ 引号作为连接符

    NR:     表示记录数量,对应当前行
    NF:     表示字段数量,对应当前行中的字段数
    $0:     表示当前行的文本内容
    $1:     表示当前行中第一个字段的文本内容
    $2:     表示当前行中第二个字段的文本内容
    ...

    print $NF: 打印一行中最后一个字段 $(NF-1) 打印倒数第二个字段
    awk 'END{ print NR }' $filename # 打印文件的总行数
    $: VAR=100; echo | awk -v VARIASLE=$VAR '{ print VARIASLE }'   # -v: 可以通过外部值传给 awk
    $: var1='v1';var2='v2'; echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2

getline 函数: 读取文件中的某一行
    getline var
    seq 5 | awk 'BEGIN{ getline; print "test ", $0 } { print $0 }'
    awk 'NR < 5'        # 行号小于 5 的行
    awk 'NR==1,NR==4'   # 行号在 1-5 之间的行(不包含第 5 行)
    awk '/linux/'       # 包含 linux 的行
    awk '!/linux/'      # ! 不包含 linux 的行

    awk -F: '{ print $NF }' /etc/passwd     # -F 指定一个定界符,默认为空格
    awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd # 同上

    awk 内的字符串函数:
        length(string)                      # 字符串长度
        index(string, search_str)           # 返回 search_str 在字符串中的位置
        split(string, array, delimiter)     # 用定界符 delimiter 生成一个字符串列表
        substr(string, start_pos, end_pos)  # 在字符串中取出 start-end 之间的字符生成子串
        sub(regex, replace_str, string)     # 将正则表达式匹配的第一个内容替换成 replace_str
        gsub(regex, replace_str, string)    # 将正则表达式匹配的所有内容替换成 replace_str
        match(regex, string)                # 检查正则表达式是否匹配字符串,若匹配则返回非0,否则返回0

读取单词中的每一个字符:
    $: var=hello
    $: for(( i=0;i<${#var};i++ )); do echo ${word:i:1}; done    # ${string:start_pos:N} 可以取单个字符或多个字符
读取一行中的每一个单词:
    $: line=‘this is a test!’;
    $: for word in $line; do echo $word; done 
读取文件中的每一行:
    $: while read line; do echo $line; done < file.txt;   ===   cat file.txt | ( while read line;do echo $line; done )

paste commands: 按列拼接
   cat exp1.txt
        1
        2
        3
        4
        5
    cat exp2.txt
        str001
        str002
        str003
        str004
        str005
    paste exp1.txt exp2.txt         # -d "," 可以指定分隔符,默认为 \t 
        1   str001
        2   str002
        3   str003
        4   str004
        5   str005

rev commands: 反转字符串     abbbb ====> bbbba
    #!/bin/bash
    string=malayalam
    if [[ $string == $( echo $string | rev ) ]];
    then
    echo palindrome
    else
    echo Not palindrome
    fi

----------------------------------------2017/08/29---------------------------------------------------    
wget commands:
    wget url
    wget -O $filename url                   # -O 指定下载文件的名字
    wget -c url                             # -c 可以断点续传
    wget -b url                             # -b 后台下载
    wget -i url.txt                         # -i 可以一次下载多个文件
    wget --reject=gif url                   # --reject 下载网页时不下载指定类型的文件
    wget -o download.log url                # -o 指定日志文件,并且终端不打印下载信息
curl commands:
    curl url                                # 不生成文件,直接输出
    curl url -o filename --progress         # -o 指定生成的文件名, --progress 显示进度条
    curl -C -url                            # -C 自动断点续传
    curl -I url                             # -I 只打印头部
    curl url > index.html                   # > 重定向输出

tar commands:
    tar -cf $filename.tar $source           # -c: create file; -f: define file name, put -f the last
    tar -tf $filename.tar                   # -r: list the file in *.tar
    tar -rvf $filename.tar new_file         # -r: add new_file to *.tar
    tar -tvf/-tvvf *.tar                    # -v/-vv: 列出 *.tar 文件中的详情
    tar -xf *.tar -C $PATH                  # -x: 提取文件; -C: 指定文件存放目录, 默认为当前目录
    tar -xvf *.tar $file1 $file2            # -xvf: 提取指定文件
    tar -Af 1.tar 2.tar                     # -Af: 合并两个 tar 文档,合并后的文档就是 1.tar
    tar -f *.tar --delete filename          # --delete: 从 tar 文件中删除文件
    tar --delete --file *.tar file11 file2 ... # 同上
    tar -cf *.tar * --exclude "*.txt"       # --exclude: 排除某种类型文件,并对剩下的文件进行归档; === tar -cf *.tar -X list.txt (list.txt 存储不需要归档的文件列表)
    tar --exclude-vcs -czvvf *.tar.gz $dir  # --exclude-vcs: 可以排除版本控制的文件,如 .git/.svn
    tar -cavvf *tar.gz FILES/$dir           # -a: 根据 *.tar.gz 扩展名自动判断压缩格式 (.tar.bz2)
    tar -czvvf *tar.gz FILES/$dir           # -z: 按 gzip 格式压缩
    tar -cjvvf *.tar.bz2 FILES/$dir         # -j: 按 bzip2 格式压缩
    tar -xzvvf *.tar.gz -C $dir             # -xz: 根据 gzip 解压文档
    tar -xjvvf *.tar.bz2 -C $dir            # -xj: 根据 bzip2 解压文档
    tar -xzvvf *.* -C $dir                  # -a: 根据扩展名自动选择解压缩格式 
    $703 ... --totals                       # --totals: 打印归档文件总字节数
gzip and bzip2 commands:
    bzip2/gzip filename  ====> filename.gz        # 删除原文件
    bzip2/gzip -d filename.gz ====> filename      # 删除原文件
    gzip -l *.gz                            # -l: 列出压缩文件信息
    bzip2 > gzip # 压缩率
zip commands:
    zip *.zip FILES/$dir                    
    zip -r *.zip file1 file2 ... 
    zip -d *.tar filename                   # -d: 删除压缩文件中的 filename 文件
    unzip *.zip                             
    unzip -l *.zip                          # -l: list the file in *.zip
gpg -c filename                             # 加密
gpg *.gpg                                   # 解密

ifconfig commands:
    ifconfig eth0 192.168.0.122 netmask 255.255.255.0 # 设置 ip 和 子网掩码
    ifconfig eth0 hw ether 00:0c:29:a2:32:39          # 设置 MAC 地址
host and nslookup commands:
    host baidu.com                                    # 解析某个域名的所有 ip 地址
    nslookup baidu.com                                # ...
route commands:
    route/route -n                                    # 显示路由表
    route ad default gw 192.168.0.1 eth0              # 添加网关
    traceroute baidu.com                              

other commands:
    who
        sdgl     tty7         2017-08-29 08:20 (:0)
    w
        16:58:31 up  8:15,  1 user,  load average: 0.24, 0.46, 0.46
        USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
        sdgl     tty7     :0               08:20    8:38m  9:02   0.76s /sbin/upstart --user
    uptime
        17:00:30 up  8:17,  1 user,  load average: 0.58, 0.60, 0.52    # 查看系统上电时间

ps commands:
    ps -C command           # list the command ID
    ps -C command -o pid=
    ps -eo comm,pcpu        # pcpu pid ppid pmem comm cmd user nice time etime tty euid stat 

kill commands:
    kill -l                 # list all singal
    kill -s SINGAL pid      # send singal to the pid progress

trap commands:
    trap 'fuction_name' SINGAL LIST         # 将某个函数分配给一个信号,当信号发生时执行函数 
        #!/bin/bash
        #filename: sighandler.sh
        function handler()
        {
        echo Hey, received signal : SIGINT
        }
        echo my process ID is $$
        trap handler SIGINT
        while true;
        do
        sleep 1;
        done

读书笔记已同步更新到github上:learnShel.note

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值