大数据正式5

来源:互联网 发布:淘宝商城珠宝 编辑:程序博客网 时间:2024/06/10 22:31

大数据正式5

常见的shell命令

  • 管道命令
    • 管道符| 将两个命令隔开,左边命令的输出就会作为管道右边命令的输入
    • 连续使用管道意味着第一个命令的输出作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,以此类推。
  • find命令
    • linux最有用的命令之一
    • 在一个目录及子目录中搜索文件,可以指定一些匹配条件(如按文件名,文件类型,用户甚至是时间戳查找文件)
    • 命令格式find [path] [-option]
    • path:find命令所查找的目录路径,例如用.来表示当前目录,用/来表示系统根目录
    • options:find命令的常用选项
      • print:将匹配的文件输出到标准输出
      • size:匹配文件的大小
        • 显示大小为0的文件find ./ -size 0
      • name按照文件名查找文件
      • perm按照文件所属的组来查找文件
        • 查找权限为755的文件find . -perm 755
      • user按照文件的所有者来查找文件
        • find ~ -user root
      • group按照文件所属组来查找文件
      • mtime -n按照文件的更改时间来查找文件,据现在在几天以内
      • mtime +n据现在n天以前
      • nogroup查找无有效所属组的文件,即该文件所属组为/rtc/group中不存在
      • type b块设备
      • type d目录
      • type c字符设备文件
      • type p管道文件
      • type l符号链接文件
      • type f普通文件
      • size n :[c]查找文件长度为n块的文件,带有c时表示长度以字节计
        • find . -size +1000c在当前目录下查找文件长度大于字节的文件
  • sed命令
    • 非交互式文本处理工具
    • 默认情况下,所有的输出行都被打印到屏幕上
    • sed编辑器逐行处理文件(或输入),并将结果发送到屏幕,具体过程如下:

      1. sed把当前正在处理的行保存在一个临时缓冲区(也称之为模式空间)2. 然后处理临时缓冲区的行,完成之后把该行发送到屏幕上3. sed每处理完一行就将其从临时缓冲区删除,然后进行下一行的读入,进行处理和显示4. 处理完文件的最后一行,sed便结束运行5. 注:sed把每一行都存在临时缓冲区,对这个副本进行编辑,所以不会修改原文件
    • sed命令格式sed [option] "[action]" [filename]
      • option
        • h或-help显示帮助
        • n仅显示script处理后的结果
        • V或version显示版本
        • e允许对输入数据应用多条sed命令进行编辑
        • f直接将sed的动作写在一个文件里,-f filename 则可以运行,filename 内的sed动作
      • action
        • s字符串替换
        • i插入
        • d删除
        • a追加
        • c替换
        • p打印指定的输出行

        例:1. sed "s/aa/bb/g" .demo.txt表示把aa替换成bb在一行上2. sed "s/aa/bb/g" demo.txt > demo1.txt重定向3. sed "3s/aa/bb/g" demo.txt只替换第三行4. sed "1,2s/aa/bb/g" demo.txt替换第一到第二行的文本5. sed "s/a/b/1" demo.txt替换每一行的定义一个6. sed "s/a/b/2" demo.txt替换每一行的第二个7. sed "1s/o/O/3g" demo.txt替换第一行的第三个以后的o8. 多个匹配    1. sed 's/l/L/1;s/o/O/3g' demo.txt    2. sed -e 's/l/L/1' -e 's/o/O/3g' demo.txt9. sed "1 i hi word" demo.txt在第一行添加10. sed " 1 a hi word" demo.txt 在一行追加11. sed "/hdfs/d" demo.txt 删除匹配行
  • grep命令
    • global search regular expression and print out the line全面搜素正则表达式并把行打印出来
    • 形式 grep [options] pattern [FIFE...]
      • ?同时显示匹配行上下的?行、
        • grep -2 pattern filename同时匹配行的上下行
      • b,--byte-offset打印匹配行前面打印该行所在的块号码
      • c,--count只打印匹配的行数,不显示匹配的内容
      • f File,--file=File从文件中提取模板。空文件包含0个模板,所以什么也不匹配
      • h ,--no-filename当搜索多个文件时,不显示匹配文件名前缀
      • i,--ignore-case忽略大小写差别
      • q,--quit取消显示,只返回退出状态,0则表示找到了匹配的行
      • n,--line-number在匹配的行前面打印行号
      • v,--revert-match反检索

      例:    1. 在ls显示的内容中查看包含test的行ll |grep test    2. 在ls显示的内容中查看包含test的行并用颜色区分ll |grep test --color    3. 在ls显示的内容中查看包含test的行并用颜色区分并添加行号ll |grep test --color -n    4. 在ls显示的内容中查看包含test(忽略大小写)的行并用颜色区分并添加行号ll |grep test --color -n -i    5. 在ls显示的内容中查看包含demo的行并用颜色区分、并添加行号、包含上下2行ll |grep test --color -n -2    6. 在ls显示的内容中查看包含test的总数ll |grep test --color -n -c
  • tail命令
    • 把某个档案文件的最后几行显示到终端上,如果该档案有更新,tail也会自动刷新,确保你看到的最新的档案内容
    • tail [-F] [-c Number | -m Number | -b Number] [File]
      • -F 该参数用于监视File的增长
      • -c Number从Number字节位置读取指定文件
      • -n Number从Number行位置读取指定文件
      • -m Number从Number多字节字符位置读取指定文件,c可能导致截断,但使用m则会避免该问题
      • -b Number从Number表示的512字节块位置读取指定文件
      • -k Number从Number表示1kb块的位置读取指定文件
      • File指定操作的目标文件名
      • 当涉及到number,如果不指定,默认显示10行,Number前面可使用正负号,表示该偏移从顶部还是从尾部开始计算

        例:    1. tail -F filename显示filename文件的尾部内容(默认10行,相当于添加参数 -n 10)    2. tail -n 20 filename显示filename的最后20行    3. tail -n +20 filename 不包含前19行,从第20行开始显示
  • sort命令
    • 按照字符排序
    • n按照数值排序
    • u不出现重复的行
    • t指定分段的符号
    • k指定第几个段
    • r逆向排序

    例:    1. 对文件进行制定分隔符,并对第四个字段排序        sort -t "." -k 4 demo
  • cut命令在文件中负责剪切数据用的
    • 命令格式:cut [-options] filename
    • options
      • b字节
      • c字符
      • f提取第几列
      • d按指定分隔符分隔列

      例:    1. 每一行第二个字节cut -b 2 demo    2. 每一行第五个到第七个字节cut -b 5-7 demo    3. 第九个字节之后cut -b 9- demo    4. 第九个字节之前cut -b -9 demo    5. 以点为分隔符获取第二个字段cut -d . -f 2 demo
  • history命令
    • 显示全部历史
    • history 5 显示执行过的上5条命令
    • !!运行上一条命令
    • !88运行第88条命令
    • !88 /test 运行第88条命令并在命令后面加上/test
    • !?CF? 运行上一个包含CF字符串的命令
    • !ls运行上一个ls命令
    • !ls:s/CF/l运行上一个ls命令,其中把CF替换成l
    • fc编辑并运用上一个历史命令
    • fc 66编辑并运行第66个历史命令
    • fc -e /usr/bin/vim 66 使用vim编辑第66个命令 并运行
    • 搜索历史命令!!!,重复按ctrl+r可以在历史命令列表中不断向前搜索包含字符串的命令,回车就会执行查找的命令
    • 清空历史命令history -c

shell脚本高级

  • Shell Script

    • 其实就是纯文本文件,以固定的语法组成起来
    • 可以编辑这个文件,让这个文件帮我们一次执行多个命令
    • 可以通过一些运算与逻辑判断来帮助我们达成某个较复杂的功能
    • shell script的注意事项

      1. 命令的执行,是从上到下,从左到右执行2. 命令选项与参数间的多个空格会被忽略3. 空白行也被忽略掉,tab也被视为空格4. 如果读取一个Enter符号(CR),就尝试开始执行该命令行5. #后面的内容为注释
    • Shell script如何执行

      • 假设程序的名字是/home/shell.sh
      • 执行脚本有以下三种方式

        1. 直接执行(shell.sh文件必须具备可读与可执行(rx)的权限)    1. 绝对路径:运行/home/shell.sh来执行文件    2. 相对路径:cd到/home/使用./shell.sh执行2. source执行source shell.sh3. bash执行 base shell.sh  sh shell.sh

        例:1. 创建Shell脚本文件vim /home/shell.sh2. 插入    #!/bin/bash    #Shows current account's home    echo "current account's home is" $HOME    esc -> :wq3. ll /home/发现shell.sh没有执行的权限4. 设置权限chmod 755 shell.sh

        #!/bin/bash#Shows system date echo $(date +%F)exit 01. 第一行,告诉系统如何执行脚本执行脚本,当采用直接执行(不是类似sh xxx.sh这样的方式)时,此行必须有,且要放在首行2. 除了第一行之外的#都是注释,其他为程序部分3. exit 0 ,以0作为该脚本的执行的返回值,执行正常退出返回0.一个脚本执行完成,之后的shell进程可以通过$?来获取执行结果4. 命令:base mysh.sh5. 命令:echo $?
      • 数值运算:简单的加减乘除 格式$(运算的内容)
        • 案例:两数相乘

          #!/bin/bash#User inputs 2 integer numbers; program will cross these two read -p "first number:" num1read -p "second number:" num2total=$(($num1)*($num2))echo -e "\nThe result of $num1 X $num2 is ==> $otal"exit 0
  • test 判断命令
    • 范例 test -e demo.txt
    • 判断某个文件类型
      • e该文件是否存在
      • f该文件是否存在且为文件(File)
      • d该文件是否存在且为目录(directory)
      • b该文件是否存在且为一个block device装置
      • c该文件是否存在且为一个character device装置
      • S该文件是否存在且为一个Socket文件
      • P该文件是否存在且为一个FIFO(pipe)文件
      • L该文件是否存在且为一个链接文件
    • 判断文件的权限
      • r检查该文件是否存在具有可读的权限
      • W检查该文件是否存在具有可写的权限
      • x检查该文件是否存在具有可执行的权限
      • s检查该文件是否存在,且为非空文件
      • u检查该文件是否存在具有SUID的属性
      • g检查该文件是否存在具有SGID的属性
    • 判断字符串
      • test -z string 判断字符串是否为空
      • test -n String 判断字符串是否为非空
      • test str2 = str2判断str1是否等于str2,若相等,则返回true
      • test str2 != str2判断str1是否不等于str2,若不相等,则返回true

    例:    1. 编写shell脚本,实现判断:        1. 是否输入了文件名,如果为空提示:you must input a filename,并结束脚本        2. 判断文件是否存在?不存在则结束脚本        3. 判断文件类型以及统计文件都有哪些权限        4. 输出文件类型和文件所有的权限

        #!/bin/bash    #program:you input filename,program will check    echo -e "please input a filename ,i will check it isn't exist,type and permission.\n"    read -p "input a filename:"filename    #1.check filename is not null    test -z $filename &&echo "you must input a filename."&&exit    #2.check file is exit? no exist end program    test ! -e $filename&&echo "the filename $filename not exit"&&exit 0    #3.check file type and permission    test -f $filename&&filetype="file"    test -d $filename&&filetype="directory"    test -w $filename&&perm="writable"    test -r $filename&&perm="{$perm},readable"    test -x $filename&&perm="{$perm},executable"    #4.show file message    echo "the filename:$filename is a $filetype"    echo "and the  permission are : $perm
    • 两个文件之间比较
      • nt 判断文件1 是否比 文件2 新
      • ot 判断文件1 是否比 文件2 旧
      • ef 判断两个文件是否为同一个文件
    • 判断符号[]基本跟test相同
    • [ ]脚本范例(注意[]和脚本之间保留空格)
    • ==和!=用于比较字符串
    • 整数比较只能用-eq,-gt这种形式
    • [] 中逻辑与逻辑或使用-a和-o表示
    • &&、||、<和>操作符如果出现在[]结构中的话,会报错

    例:    #!/bin/bash    #this shell show user's choice    read -p "Please input (Y/N):"yn    ["$yn"=="Y" -o "$yn"=="y"]&&echo "choice Yes"&&exit 0    ["$yn"=="N" -o "$yn"=="n"]&&echo "choice No"&&exit 0

shell script参数

  • shell script 默认参数
  • 比如,ls -al其中-al就是shell的脚本参数,那么我们自己写的脚本该如何使用?
  • /path/to/scriptname arg1 arg2 arg3 arg4对应$0 $1 $2 $3 $4
    • $0表示脚本程序本身
    • $1 $2...代表后面的第一个参数,第二个参数,等等
    • $# 代表后面接的参数个数,以上边为例,这里显示为4
    • $@代表"$1","$2","$3","$4",每个变量是独立的(用双引号括起来)
    • $*代表"$1 $2 $3 $4"
  • 功能
    • 程序的文件名$0
    • 共有几个参数$#
    • 若参数的个数小于2,则告知使用者参数数量太少,全部的参数内容是$@
    • 第一个参数是$1
    • 第二个参数是$2

    例:    #!/bin/bash    echo "the script name is==>$#"    echo "total parameter number is==>$#"    ["$#" -lt 2]&&echo "the number of parameter is lt 2"&&exit 0    echo"1st parameter==>$1"    echo"2nd parameter==>$2"    echo"your whole parameter is==$@"
    • shift造成参数变量号码偏移

      #!/bin/bashecho"total parameter number is==>$#"echo"your whole parameter is==>$@"#shift one parametershiftecho"total parameter number is==>$#"echo"your parameter number is==>$@"#shift three parametershift 3echo"total parameter number is==>$#"echo"your whole parameter is==>$*"

条件判断语句

if[条件判断]    thenif[条件判断];then    条件成立执行,命令;fi 将if反过来写,就成为fi,结束if语句&&代表 and || 代表 or

例:    #!/bin/bash    #compare the size of the two numbers"    a=12    b=13    if[$a-gt$b]        then         echo "Yes,$a>$b"        exit 0    fi    if[$a-le$b];then        echo "Yes,$a<=$b"        exit 0    fi
  • 思考:比较两个传参进来的数字的大小

    #!/bin/bash#compare the size of the two numbers"if[$1-gt$2]    then     echo "yes $1>$2"    exit 0fiif[$1 -le $2];then    echo "yes$1<=$2"    exit 0fi
  • 思考:read方式比较两个传参进来的数字的大小

    #!/bin/base#compare the size of the two numbers"read -p "please input two  numbers:" a bif[$a -gt $b]    then     echo "Yes,$a>$b"    exit 0fiif[$a -le $b];then    echo "yes $a<=$b"    exit 0
  • 思考:实现如果/shell/scripts下面存在if3.sh就打印if3.sh存在,如果不存在就“创建”(注意目录是否存在以及不存在时的创建问题)

    #!/bin/bashFIFEPATH="/shell/scripts"if[-e "$FIFEPATH/if2.sh"];then    echo "$FIFEPATH/ifs.sh is exit"fiif[!-e"$FIFEPATH/if3.sh"];then    [!-d $FIFEPATH]&&mkdir -p &FIFEPATH    [-d $FIFEPATH]&&{        cd $FIFEPATH        touch if3.sh        echo"if3.sh is touched"    }fi

双分支结构

if[条件1];then    条件1成立执行,指令集1else    条件1不成立时执行指令集2;fi

if[条件1];then    条件1成立,执行指令集1elif[条件2];then    条件2成立,执行指令集2else    条件都不成立,执行指令集3fis

例:判断大于,等于还是小于命令:cp ifdemo.sh if5.sh命令:vim if5.sh#!/bin/bash#compare the size of the two numbersread -p "please input two numbers:"a bif[$a-gt$b]    then     echo "yes $a>$b"    exit 0elif[$a -eq $b];then    echo "yes $a=$b"    exit 0else            echo "yes $a<$b"    exit 0fi测试:命令:bash if5.sh     please input two number: 4,5     yes 4<5

使用文件名后跟参数的方式,使用单分支判断参数个数是否为2,不为2提示格式错误并退出;再多分支结构进行判断小于,等于,大于

命令:cp if5.sh if6.sh命令:vim if6.sh#!/bin/bash#compare the size of the two numbersif[$# -ne2];then    echo "usage is :bash $0 num1 num2"    exit 1;fifi a=$1b=$2if[$a-gt$b]    then    echo "yes $a>$b"    exit 0elif[$a-eq $b];then    echo "yes $a =$b"    exit 0else     echo "yes $a<$b"    exit 0fi

case结构条件句

case $变量名称 in "值1"    程序段1    ;;    "值2")    程序段2    ;;    *)    exit 1    ;;    esac

例:判断用户输入的数是哪个数,1-9显示输入的数字,大于9的显示please Input less 9

函数定义语句

function fname(){    命令}

script脚本检查

  • sh [-nvx] script.sh
    • 选项与参数
      • n不执行script,仅查询语法的问题
      • v在执行script前,先将scripts的内容输出到屏幕上
      • 将使用到的script内容显示到屏幕上,这是很有用的参数

循环语句

  • 不定循环:while do done,util do done
  • 固定循环for ... do done
  • while循环语句

while [condition];do命令done

while [condition]do命令done

例:每隔两秒打印系统负载情况#!/bin/bashwhile[true]do uptime#系统负载情况sleep 2 #休眠2秒donectrl+c结束死循环

例:计算1+2+3+...+100的和并输出    #!/bin/bash    sum=0    i=1    while [$i -le 100]#while和[之间要加一个空格 true则执行    do         sum=$(($sum)+($i))        i=$(($i)+(1))    done    echo "the result of '1+2+3+...+100' is $sum"
  • until循环语句

    until [condition] ;do命令done

    until [condition]do命令done

    例:#!/bin/bashi=0until ["$i" -gt 5] #大于5    do        let sequare=i*i        echo "$i * $i=$square"    let "i++"done
  • for循环

for...do...done循环语法    for 变量名 in 变量取值列表    do    命令    done提示:在此结构中“in变量取值列表” 可省略,省略时相当于使用for i in "$@"

例(方法一:直接打印):直接列出变量表所有元素,打印5、4、3、2、1    #!/bin/sh    for num in 5 4 3 2 1#=>需要空格隔开        do            echo $num        done

例(方法二:使用大括号):直接列出变量表所有元素,打印5、4、3、2、1    命令:echo{5..1}    命令:echo{a..z}    命令:10.0.0.{5..1}    #!/bin/sh    for num in {5..1}    do         echo $num    done

例(方法三:使用seq -s 分隔符 起始 步长 终点):直接列出变量表所有元素,打印5、4、3、2、1        命令:seq -s "" 5 -1 1    #!/bin/sh    for num in 'seq -s "" 5 -1 1'    do         echo $num    done

例:获取当前目录下的文件名作为变量列表打印输出    #!/bin/sh    for num in 'ls-F'    do         echo $num    done

Linux目录结构

  • /
    • /root
      • /Desktop
      • /Maildir
    • /bin(Binary的缩写,这个目录存放着,最经常使用的命令)
    • /boot(这里放的是启动Linux的一些核心文件,包括一些链接文件以及镜像文件)
    • /dev(dev是Device的缩写,该目录存放的是Linux的外部设备,在linux中访问设备的方式是相同的)
    • /etc(这个目录存放的是所有系统管理所需要的配置文件和目录)
    • /home(用户的主目录,在Linux中,每个用户都有自己的一个用户,一般的目录是以用户的账号命名的)
    • /var
    • /lib(这个目录存放着系统最基本的动态链接共享库,其作用类似于windows里的DLL文件,几乎所有的应用程序都需要用到这些共享库)
    • /usr
      • bin
      • lib
    • /media
    • ...

Linux文件属性与权限

-rwxrwxrwx.2rootroot1222Dec 15 14.28install.log文件类型:
d代表目录
-代表文件
l代表连接文件
b块设备
c字符设备表示有多少文件名链接到此节点文件拥有者权限文件组权限文件其他人权限文件所属人文件所属组文件大小文件创建时间文件名称,.开头的为隐藏文件
rwx代表[读]、[写]、[执行]的权限,若没有某个权限,则用-代替;三个为一组,共有三组,第一组为文件所有者的权限,第二组是同用户组的权限,第三组是其他用户的权限。rwx的权限对应的数字为:4,2,1rwx=4+2+1=7r=4rw=4+2=6

改变所属用户组和权限

目的命令改变文件所属组chgrp [-R] dirname/filename
-R如果为目录递归修改组
例如:chgrp peng install.log改变文件所属者chown [-R] 用户账号 dirname/filename
或 chown [-R] 用户账号:用户组名 dirname/filename
例如:chown peng:peng install.log改变文件的权限chmod [-R] mode dirname/filename
例如:chmod 777 hello.java
或者chomd u=rwx,g=rwx,o=rwx hello.java
权限对文件的重要性:1. 在Linux中,文件是否能被执行是由是否具有“x”这个权限来决定,与拓展名无关2. r读取3. w写4. x执行
权限对目录的重要性:1. r读取文件结构2. 改变文件结构3. x使用者能否进入该目录成为工作目录(工作目录就是所在的目录)

文件拓展名

*.sh*Z,*tar,*.tar.gz,*.zip,*.tgz*.html,*.php脚本或批处理文件压缩文件网页相关的文件

Linux文件长度限制

  • 单一文件或目录的最大容许文件名为255Bytes,(英文255的字符,中文128个字符)
  • 进来避免特殊字符:*?><;&![]|\'"`(){}

可执行文件路径的变量:$PATH

  • PATH命令由一些目录组成,每个目录由:分隔,加入到PATH中就可以直接执行这些命令
  • 将某一个命令加入到PATH中
    • PATH="${PATH}:/root"
原创粉丝点击