工作中shell使用技巧【想到多少写多少】

一、shell的种类:

    linux上有好几种shell 可以使用,脚本的开头#!/bin/bash指定该脚本为bash执行;而我们终端默认的是sh,通过ll  /bin/sh可以看到指向的是dash,在不同的shell下命令的一些选项意义会有些许不同,在执行脚本的时候指定shell,如sh test.sh是使用默认的shell,bash test.sh是指定bash。

二、grep的使用:

grep是linux一个特别常用的指令,主要就是对文本就行模式查找;

grep的常用选项:

-c 显示匹配的行数;

-i 忽略大小写

-h 查询多文件时不显示文件名

-l 查询多文件时只输出包含匹配字符的文件名

-n 显示匹配行及行号

-v 显示非匹配的文本行

        精确匹配可以在字符串后面加上“\>”,如grep “android\>” test.txt,但是在观察中发现,精确匹配只对关键的末尾进行匹配,如echo “android” | grep "oid\>" 是可以匹配的,但是echo “android” | grep "and\>"就是无法匹配的,在使用中需要注意;

        正则模式匹配,模式匹配需使用单引号,如 grep '[0-9]\{3\}[8]' test.txt,其中具体的正则表达式可以根据不同情况去写入不同的;

        匹配“或”“与”,如grep -E '219|216' text.txt;

        显示匹配内容--color=always

正则表达式:

        ^:匹配开头,如

        $:匹配结尾,

        .:陪任意一个单字符

        *:一个单字符后紧跟*,匹配0个或者多个此单字符;

        []:匹配[]内字符,[abc]匹配a或者b或者c,[a-c]匹配同上;

        [^]:匹配非[]内字符,[^abc]匹配a或者b或者c,[^a-c]匹配同上;

        pattern\{n\}:匹配模式n次

        pattern\{n,\}:匹配模式至少n次

        pattern\{n,m}:匹配模式n到m次

    

三、命令执行顺序

        &&:减少判断语句:如cp a b && rm -r a;这是如果cp操作失败则不会删除a,如果是常规写法

        cp a b;

        rm -r a;此时如果cp失败,则很有可能会误删a,导致一些不好的后果,如果加上一些结果判断代码就会很冗杂;

        ||:如 cp a b || sendmail XX,如上类似;

四、sort、uniq、cut的使用:

sort指令:
sort -cmu -o outputfile [other option ] +pos1 +pos2 inputfiles

-c 测试是否已分类

-m 合并俩个分类文件

-u 去重

-o 输出文件

-b 使用域分类忽略第一个空格

-n 指定数字分类

-t 指定分割符

-r 逆序排列

+n 从第n个域开始排序

n 分类是忽略此域

post1 传递m,n m为域号,n为分类字符数,表示从第m+1个域开始第n+1个字符开始排序

-k指定第 1指定第一个域与前面不同

    域的参照方式 0为第一个,1为第二个域

sort -c 测试是否已经分类成功;

sort -t:-r 按照“:”分割 逆序排列

sort +1n 按照第二列排序 按照数字域

unique指令:

处理与重复行相关的操作,unique处理的重复行是相邻的,如果不相邻的两个一样的算不重复;
uniq -u d c -f inputfile outputfile

-u只显示不重复的行

-d只显示有重复数据行每种重复行显示一行

-c 打印每一行重复出现次数

f表示前n个域被忽略

split用法:将文件切分为多个;
    split -output_file_size input_file output_file
    output_file是文件行数,
    split -100 input.txt output
    输入文件为input.txt,按每100行一个文件分为outputaa,outputab,outputac...依次类推
    

五、awk的使用:

        awk是一个非常有用的文本处理工具,对于格式化的语句处理有很好的应用;awk处理的文本一般是格式化的,即用域分隔符划分抽取域,分隔符可能是任意字符;

        awk调用一般有三种方法:命令行,写入一个文件用awk命令解释器执行,所有awk命令插入一个单独文件然后调用;我目前使用较多的情况是第一种,直接作为一个命令来使用:awk -F '分隔符' '命令行' 输入文件

        awk执行每次读一条记录或者一行,每一行按照给定的分隔符分为若干个域,如果不指定分隔符则默认分隔符空格,

    在awk中第一个域为$1,依次类推,如awk -F "#" '{print $1}' data.txt 打印第一个列;$0代表所有列;awk执行分为3个阶段,awk ’BEGIN{print “------”}{print $0}END{print "-----"}‘BEGIN在所有文本处理工作开始前执行,可以打印一些信息,主要是做一些变量的初始化,END在所有文本处理结束后执行,主要对输出进行处理;

    awk中的正则匹配:awk中可以让指定的域去匹配模式,如awk ’{if($4~/Brwon/) print $0;}‘ data.txt表示$4匹配Brown,如果不匹配的话则awk ’{if($4!~/Brwon/) print $0;}‘ data.txt,可以在条件中添加其他正则表达式,得到不同的记录

        awk中有很多内置的变量信息:

ARGC 命令行参数个数

ARGV 命令行参数排列

ENVIRON 支持队列中系统环境变量的使用

FILENAME  awk浏览的文件名

FNR 浏览文件的记录数

FS 设置输入域分隔符,等价于命令行- F选项

NF 浏览记录的域个数

NR 已读的记录数

OFS 输出域分隔符

ORS 输出记录分隔符

RS 控制记录分隔符

1.文件处理:

   

awk中操作符与C语言类似,

hit:设置可以设置输入域为变量名,方便理解意义;

awk中的变量:awk中的变量是一直记录的直到文件处理结束,例如

awk 'BEGIN{total=3}{total+=$6}END{print total}'

会一直累加第六列的数值,一直到最后记录处理结束;

内置的字符串函数:


sprint(fmt,exp);有错,应为printf(fmt,exp);

gsub允许使用正则表达式去匹配相关字符串;

match的第二个参数可以使用正则表达式来匹配;

awk中可以传递变量,例如awk '{print age}' age=15 test.txt

awk中的数组

    awk中数组不需要定义,下标也不定是数字,可以类似key-value对;

例如统计一个文本中需要一个字符的数量:

awk '{k[$1]++}END{for(i in k) print i,k[i]}';

重定向与管道:

    awk可以将结果重定向的一个文件中,例:awk '$1 = 100 {print $1 > "output_file" }' test,也可以使用>>追加操作;

    也可以将文件中的内容重定向到awk中,例如:awk 'BEGIN{while("cat aa" | getline d) {a[d]}}';

条件控制及循环:

    与C语言中类似;但是没有switch函数;

    

http://man.lupaworld.com/content/manage/ringkee/awk.htm


六、sed的使用:

    与awk类似,sed是另一个文本编辑工具,awk和sed都不会对原始文件进行改变,他们操作的都是一个拷贝,没有重定向的话会被输出到屏幕;

    使用sed的命令为:sed [选项] 'sed命令'。

    sed的选项有:

            -e 允许多台编辑;

            -h 打印help文档

            -n 取消默认输出

            -f 引导脚本文件名

    sed处理文本可以指定处理文本的范围,定位范围的方式如下:

sed有很多编辑命令可以满足文本处理的很多任务:



比较常用的编辑功能有:

a\在定位行或者模式后面添加新文本信息

i\在匹配的行前插入与a类似;

c\对匹配的行全部替换;

d\删除匹配的行;

s\替换文本:

    替换脚本后可跟()

    & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。

    \(..\) 保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers     
  • $ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

  • $ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。

  • $ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。

  • $ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。

  • $ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100

  • $ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换

  •     n命令 $ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
shell也可以像sed传递变量,在sed中使用shell变量时 命令行引用变成双引号,如:

    name=zhang;sed "s/$name/li/";

    与sed类似还有个处理文本的命令式TR,tr的大部分功能都可以由sed完成,因此不做深入;
http://man.lupaworld.com/content/manage/ringkee/sed.htm

后台执行命令的使用

    &命令:一般执行类似下载或者系统处理的一些命令,需要等待很长时间的可以放到后台去执行,利用&命令可以实现类似多线程的功能;

        

        执行压缩指令需要很长时间,而且多个压缩命令可以同时执行,可以将几个压缩操作同时执行,但是不能一次性提交太多的后台指令,一般提交一定数量的后台操作后执行wait命令,等待后台操作执行完毕。

    basename:取文件名


    dirname:取目录名


控制流语句

    if语句:

        格式:

            if 条件

            then

                    命令

            elif

            then

                    命令

            else

                    命令

            fi

        条件:

            逻辑操作:-a 逻辑与,-o 逻辑或,!逻辑非;

            数值检测:

          字符串检测:

             

            例子1:

                if [ -z $NAME ];then

                        echo "name is null"

                fi

            例子2:

                if [ "$NAME" = "zhang" ];then

                    echo "success!"

                fi

            例子3:if echo $NAME | grep "zhang" > /dev/null 2>&1

                        echo "success!"

                    fi

            例子4:if cp myfile myfile.bk > /dev/null 2>&1

                        echo "success!"

                    else

                        echo "`basename $0`:error!"

                    fi

            例子5:if [ "`ls $FILEPATH`" = "" ];then

                        echo "no files"

                    fi

        case语句

            格式:

            case 值 in

            模式1)

                命令1

                ;;

            模式2)

                命令2

                ;;

            esac

            例子1:

                case $NUM in

                1)echo "select 1"

                    ;;

                2)echo "select 2"

                    ;;

                *)echo "select no"

                    ;;

                esac

            例子2:使用“|”符号

                case $NUM in

                y|Y|yes|YES)echo "select yes"

                    ;;

                n|N|no|NO)echo "select no"

                    ;;

                *)echo " no input"

                    ;;

                esac

        for循环语句

                格式1:

                for loop in 1 2 3 4 5

                do

                    命令

                done

                格式2:

                for (( i=0; i< 5; i++))

                do

                    命令

                done

                例子1:使用命令行参数时候不需要使用in列表

                for param

                do

                    echo "input is $param"

                done    

        while循环语句

                格式1:

                while  条件

                do

                    命令

                done

                例子1:循环读取文件中每行数据,使用IFS变量设置分隔符

                SAVEDIFS=$IFS

                IFS=:

                while read NAME ID

                do

                        echo "$NAME \t ID"

                done<name.txt

                IFS=$SAVEDIFS

shell函数

    格式:

    function 函数名(){

        命令行

    }

    函数的参数不需要在()定义,与其他编程语言不一样;

    function hello(){

        echo $0,$1,$2,$3,$4,$5;

    }

    hello a b c d

    显示"脚本名字 a b c d  ";

    函数返回可以使用return;return返回的是函数执行状态的值,0表示成功,其他表示错误,跟其他语言的返回值不一样。

sum()
{
     echo $(($1+$2))
     return $(($1-$2))
}
sum $1 $2
c=$(sum $1 $2) 
echo $?
echo $c
hadoop相关指令:
        常用的有:
        hadoop fs -ls /user/hadoop
`       hadoop fs -cat /user/hadoop
        hadoop fs -rmr /user/hadoop
        hadoop fs -mv /user/hadoop/source /user/hadoop/dest : source移到当前目录下,名字替换为dest;  
               hadoop fs -mv /user/hadoop/source /user/hadoop/dest/ source移动dest下,dest为目录;
        cp

        使用方法:hadoop fs -cp URI [URI …] <dest>

            将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。 
            示例:

    • hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
    • hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
        hadoop -put ./text.txt /user/hadoop/
        hadoop -copyFromLocal   ./text.txt /user/hadoop/都是将文件从本地拷贝到集群上
        hadoop -get /user/hadoop/text.txt ./
        hadoop -copyToLocal /user/hadoop/text.txt ./都是将文件从集群拷贝到本地
        hadoop job 命令:
        hadoop job -kill job_ID 结束任务
        hadoop job -set-priority job_ID VERY_HIGH 设置任务优先级

        

    





1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值