Linux命令

  1. /dev/stderr 代表标准错误
    /dev/stdin 输出可以用 -
    /dev/stdout 代表标准输出

  2. 输出符号意义
    > 表示先清空文件,然后再写内容
    >> 表示内容追加到现有文件的尾部

  3. /dev/null 是一个特殊的设备文件,它接收的任何数据都会丢弃

  4. 将脚本内部的文本块进行重定向

    #! /bin/base
    cat  <<EOF>> log.txt
    LOG FILE HEADER
    this is a test log file
    Function: System statics
    EOF
    
    • < 从文件读取stdin
    • > 操作符,用于截断模式的文件写入
    • >> 操作追加模式的文件写入
  5. find 命令

    1. 查找普通模式  find . -name(-iname 忽略大小写) 'aa.txt'
     	find . -name 'a*'
     	点代表当前目录,两个点代表父母目录,/ 代表根目录
     2. 更好的方法
         查找目录  find . -type d -print 
         查找文件 find . -type f -print
         如果想看更多,如权限等。加 |xargs ls -l   说明:https://www.cnblogs.com/kilometerwine/p/9872265.html
     3.  支持 与/或逻辑  find . \(-name '*.txt' -o -name '*.pdf'\) -print 
                                                                   -a 就
     4. find /home/users -path '*/slynux/*' -name '*.txt' -print
     5. 基于正则表达式
     	find . -regex  '.*\.(py\|sh\)$'
     	-iregex 忽略大小写
     	find . -iregex '.*\(\.py\|\.sh\)$'
     6. 否定参数
          find . ! -name "*.txt" -print
     7. 基于目录深度的搜索
         find -L /proc -maxdepth 1 -name 'bundlemaker.def' 2 > /dev/null 
     8. 文件类型 普通文件<=> f | 符号链接 <=> l  | 目录 -> d | 字符设备  -> c
     	 块设备 -> b | 套接字 -> s  | FIFO -> p 
     9. 根据 文件的时间戳进行搜索
     	访问时间 -atime
     	修改时间 -mtime
     	变化时间 -ctime
     	7天内访问 find . -type f -atime -7 -print
     	7天前访问 find . -type f -atime +7 -print
     10. 记录文件大小
     	find . -type f -size +2k
     11. 利用find执行相应操作
     	find . -type f -name "*.swp" -delete 
    
  6. grep

     1.  匹配多个文件
          grep "match.text" file1 file2 file 3
     2. 着重标记
         grep --color=auto world filename
     3. 使用正则
        egrep "[a-z]+"  filename 
     4. 只输出匹配到的文本
         egrep -o "[a-z]+\."
     5. 打印不匹配结果
         grep -v match_patttern filename 
     6. 统计匹配的文本行数
         grep -c  "text"  filename 
     7. 统计匹配数量
         egrep -o "{0-9}" | wc -l
     8. 打印匹配所在行
         grep linux -n sample1.txt
     9. 匹配模式所在的文件
         grep -l 'linux' simaple.txt simple2.txt   (如果相反是大写)
     10. 递归搜索多个文件
         grep "txt" . -R -n 同等与 find . -type f | xarge grep "test _function()" . -R -n 
         或  find . -type f | xargs grep "test_function()"
     11. 忽略大小写
         echo hello world | grep -i "HELLO"
     12. 匹配多个模式
         grep -e "pattern1" -e "pattern2"
         匹配到一个,就是一行
         echo this is a line of text | grep -o -e "this" -e "line"
         将多个模式放到文件中
         grep -f pattern_filesource_filename 
     13.  grep 可以在搜索中使用通配符或排除某些文件
         使用--include选项在目录中递归搜索所有的.c  和  .cpp 文件:
         grep "main()"  . -r --include *.{c,cpp}
         使用--exclud在搜索过程中排除所有的README文件
         grep "main()" . -r --exclude "README"
         选项--exclude-dir 可以排除目录
         grep main . -r -exclude-dir cvs
     14. 使用0值字节后缀的xargs 与 grep
         grep "test" file* -lZ | xargs -0 rm 
     15. grep 静默输出, 只获取是否匹配成功
         一个ssh
         #!/bin/base 
         # 文件名:silent_grep.sh
         #用途:测试文件是否包含特定的文本内容
         if [$# -ne 2]; then
             echo "Usage:$0 match_text filename*"
             exit 1
         fi
         match_text=$1
         filename=$2
         grep -q "$match_text"  $filename
         if [$? -eq 0]; then 
             echo "the text exists in the file"
         else 
             echo "text does not exists in the file"
         fi
     执行命令
     ./silent_grep.sh Student student_data.txt
     16. 打印出匹配文本之前或之后的行
         选项-A可以打印匹配结果之后的行
         seq 10 | grep 5 -A 3
    
  7. 正则表达式

     1. 匹配任意单词的正则表达式
       ( +[a-zA-Z]+ +)
     2. 匹配句尾或是都前的单词
       ( +[a-zA-Z]+[?,.]? +)
       
       [?,.]? 表示仅需要匹配问号、逗号或点号中的一个
     3. [[:digit:]] 表示数字
    
  8. 使用cut按列切分文件

    cut命令可以按列,而不是按行来切分文件。该命令可用于处理使用使用固定宽度字段的文件。CSV文件或是由空格分隔的文件
    
    1. 选项 -f 可以指定要提取的字段
       cut -f FIELD_LIST filename
       $cut -f2,3 filename
    2. --complement 选项显示出没有被-f 指定的那些字段
       cut -f3 --complement student_data.txt
    3. 选项-d 能够设置分隔符
       cut -f2 -d";" delimited_data.txt
    4. 指定字段的字符或字节范围
       N- 从第N个字节、字符或字段开始到行尾
       N-M 从第N个字节、字符或字段开始到第M个
       -M 从第1个字节,到第M个
    5. 指定字段的字符或字节范围
       -b 表示字节
       -c 表示字符
       -f 用于定义字段
    6. --output -delimiter 可以指定输出分隔符
       cut range_fields.txt -c-2,6-9 --output-delimiter ","
    
  9. 使用sed替换文本

    1. 替换
       sed 's/pattern/replace_string/' file
       cat etc/passwd/ | cut -d : -f1,3 | sed 's/:/ - UID: /'
    2. 选项-i 会使得sed用修改后的数据替换原文件  
       $sed -i 's/text/replace' file
    3. g标记可以使sed执行全局替换
       /#g 标记可以使sed替换第N次出现的匹配:
       -  $ echo thisthisthisthis | sed 's/this/THIS/2g'
        thisTHISTHISTHIS
       - $ echo thisthisthisthis | sed 's/this/THIS/3g'
            thisthisTHISTHIS 
    4. sed命令会将s之后的字符视为命令分隔符
       sed 's:text:replace:g'
       转义 : sed 's|te\|xt|replace|g'
    5. 正则表达式 -- 移除空行 ^$ 匹配空行, /d 执行删除
        sed '/^$d' file
    6. 直接在文件中替换
        sed 's/PATTERN/replacement' -i filename
        sed -i 's/\b[0-9]\{3\}\b/NUMBER/g' sed_data.txt
        其中\b 表示单词边界
        - 还可以先不替换源文件,新建一个
          sed -i.bak 's/abc/def/' file
     7. 已匹配字符串 标记(&)
        $echo this is an example | sed 's/\w\+/[&]/g'
         [this] [is] [an] [example]
         \w\+ 匹配每一个单词
     8. 字符串匹配标记
        $echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1'
         this is 7 in a number
         \(pattern\) 用于匹配子串
         \1 匹配到的第一个字段
         - secho seven EIGHT | 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
     9. 组合多个表达式
        sed 'expression' | sed 'expression'
        等同于,sed 'expression;expression'
        或者: sed -e 'expression' -e 'expression'
        示例: 
            echo abc | sed 's/a/A/' sed 's/c/C/'
     10. sed 表达式通常用单引号来引用,shell会在调用sed前先扩展双引号内容
        $text = hello
        $echo hello world | sed "s/$test/HELLO"
        HELLO world
     11. sed /s/pattern/replace/p,   /p 会把匹配到的行再输出一遍,也就时匹配到的行会重复输出
     12. sed -n /s/pattern/replace/p   -n 与 /p 就只输出匹配到的行
     13. tac logs/smartfox.log | sed -n '/com.elex.cok.common.core.ThreadTask/ {/50*/ s/503/&\n\n\n/;p}'    | less -- 相当于 tac file | sed -n '/A/ {B/ s/C/repace/;p}'   (;p - 默认输出)
     14. 参考网址https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html
    
  10. 使用awk进行高级文本处理

    awk 脚本的结构如下:
    -  awk 'BEGIN{ print "start"} pattern {commands} END {print "end"}' file 
    -  awk 'BEGIN {statements} {statements} END {end statements}'
    -  awk "BEGIN {i =0} {i++} END {print i}" filename
    1. 中间{} 默认执行{print}
    2. print 能够接受参数,这些参数以逗号分隔
        echo | awk '{var1="v1";var2="v2";var3="v3";print var1,var2,var3;}'
    3. 特殊变量
        - NR: 表示记录编号,当awk将行作为记录时,该变量相当于当前行号
        - NF: 表示字段数量,在处理当前记录时,相当于字段数量,默认的字段分隔符是空格
        - $0: 该变量包含当前记录的文本内容
        - $1: 该变量包含第一个字段的文本内容
        - $2: 该变量包含第二个字段的文本内容
        
    3.awk使用正则
        seq 10 | awk 'BEGIN{print "start"} /6.*/ {print} END{print "end"}'
    4. 例子
        echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | \
        awk '{
            print "Line no:"NR",No of fields:"NF, "$0="$0,
            "$1="$1,"$2="$2,"$3="$3
        }'
    5. 打印每一行的第二和第三个字段
        awK '{print $3,$2}' file
    6. 我们可以使用NR统计文件行数
        awk 'END {print NR}' file
    7. 借助选项-v, 我们可以将外部值传递给awk:
        $VAR=10000
        $ echo | awk -v VARIABLE = $VAR '{print VARIABLE}'
    8. 还有一种灵活的方法可以将多个外部变量传递给awk
        $ var1 = "Variable1"; var2 = "Variable2"
        $ echo | awk '{print v1, v2}' v1=$var1 v2 = $var2
        当输入来自于文件而非标准输入时,使用下列命令
            $ awk '{print v1,v2}' v1=$var1 v2=$var2 filename
    9. 用getline读取行
        seq 5 | awk 'BEGIN {getline;print "Read ahead first line", $0}' {print $0}
    10. 使用过滤模式对awk处理的行进行过滤
        $ awk 'NR < 5' # 行号小于5的行
        $ awk 'NR==1, NR==4' # 行号在1到5之间的行
        $ awk '/linux/' #包含模式为linux的行(可以用正则表达式来指定模式)
        $ awk '!/linux/' # 不包含模式为linux的行
    11. 设置字段分隔符
        awk -F: '{print $NF}' /etc/passwd
        或者  awk 'BEGIN {FS=":"} {print $NF}' /etc/passwd
    12. 从awk 中读取命令输出
        “command” | getline output;
        $awk 'BEGIN {FS=":"} {"grep root /etc/passwd" | getline; print $1,$6}'
    13. 在awk中使用循环
        awk 'BEGIN {FS=":"} {nam[$1]=$5}} END{for {i in name} {print i,nam[i]}}' /etc/passwd
    14. 使用if
    	netstat -tanp  | awk '{if ($2 > 0 || $3 > 0) print $0}'
    15. awk内建的字符串处理函数
        - length(string) : 返回字符串string的长度
        - index(string,serach_string) : 返回search_string 在字符串string出现的位置
        - split(string, array, delimiter):以delimiter作为分隔符,分割字符串string,将生成的字符串存入数组array
        - substr(string, start-position, end-position) : 返回字符串string中以start-position 和 end-position 作为起止位置的字符串
        - sub(regex, replancement_str, string): 将正则表达式regex匹配到的第一处内容替换成replacement_str
        - gsub(regex, replacement_str, string) : 和sub()类似。不过该函数会替换正则表达式 regex匹配到的所有内容
        - match(regex, string) : 检查正则表达式regex是否能够在字符串string中找到匹配。如果能够找到,返回非0值;否则,返回0. match() 有两个相关的特殊变量,分别是RSTART 和 RLENGTH。变量RSTATRTv包含了匹配内容的起止位置,而变量RLENGTH包含了匹配内容的长度
    16.  更多例子
    		https://blog.csdn.net/weixin_39953236/article/details/112127491
    
  11. 用tr进行转换

    tr 是translate(转换)的简写
        1. tr [options] set1 set2
        2. 要将输入中的字符由大写转换为小写,可以使用下面的命令
            echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
            hello who is this
        3. tr 进行加密和解密
            echo 12345 | tr '0-9' '9876543210'
                87654 # 已加密
            echo 87654 | tr '9876543210' '0-9'
                12345 # 已解密
        4. 用tr删除字符
            cat file.txt | tr -d '[set1]'
            例如: 
               echo "Hello 123 world 456" | tr -d '0-9'
               hello world
        5. 字符组补集
            tr -c \[set1\] [set2]
            - 从输入文本中删除不在补集中的所有字符
              echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'
              124
            - 不在set1中的字符替换成空格
              echo hello 1 char 2 next 4 | tr -c '0-9' ''
                  1    2   4
            - 删除多余的空格
              tr -s ' '
            - 删除多余的换行符
              tr -s '\n'
            - cat sum.txt | echo $[ $(tr '\n' '+' ) 0 ]
            
            - 包含字母和数字的文件, 计算数字之和
              cat test.txt | tr -d [a-z] | echo "total: $[$(tr ' ' '+'')]"
            - 字符类
                alnum : 字母和数字
                alpha : 字母
                cntrl : 控制(非打印)字符
                digit : 数字
                graph : 图形字符
                lower : 小写字母
                print : 可打印字符
                punct : 标点符号
                space : 空白字符
                upper : 大写字母
                xdigit : 十六进制字符
                
                可以按照下面的方式选择所需的字符类
                tr [:class:] [:class:]
                例如 : 
                    tr '[:lower:]' '[:upper:]'
    
  12. 统计特定文件中词频

    if [$# -ne 1];
    then
        echo "Usage: $0 filename";
        exit -1
    fi
    
    filename=$1
    egrep -o  "\b[[:alpha:]]+\b" $filename | \
        awk '{ count[$0]++ }
            END{ printf{"%-14s%s\n","World","count"}}' ;
                for(ind in count)
                {   printf("%-14s%d\n",ind,count[ind]);
                }
    - 可以利用tr命令将大写单词和非大写单词合计为一个单词,然后用sort命令排序输出:
        egrep -o "\b[[:alpha:]]+\b" $filename | tr [A-Z] [a-z] | \
            awk '{ count[$0]++ }'
                END{ printf{"%-14s%s\n","World","count"} ;
                    for(ind in count)
                        { printf("%-14s%d\n",ind,count[ind]);
                        }
                }' | sort 
    
  13. 例子

    1. cat sample.js | \
        tr -d '\n\t' | tr -s ' ' \
        | sed 's:/\*.*\*/::g' \
        | sed 's/ \?\([{}();,:]\) \?/\1/g' 
    2. 打印从M行到N行之间的文本:
        $ awk 'NR==M, NR==N' filename
        例如:
            seq 100 | awk 'NR==4,NR==6'
    3. 打印位于模式start_pattern 与 end_pattern之间的文本
        $ awk '/start_pattern/, /end_pattern/' filename
        awk '/pa.*3/, /end/' section.txt 
    4. tac 命令, 倒序
        - seq 5 | tac
        - tac命令默认使用\n作为行分隔符。使用-s 指定其他分隔符
            echo "1,2" | tac-s,
        - 使用awk的实现方式
            seq 9 | \
                awk '{ lifo[NR]=$0 } \
                    END {for(lno=NR;lno>-1;lno--){print lifo[lno]; }
                    }' 
     5. find . -name *.cpp -print0 | \
        xargs -I{} -0 sed -i 's/Copyright/Copyleft/g' {}
    
  14. if 相关

    • https://blog.csdn.net/hack8/article/details/53164296
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值