大数据正式5 旧城等待, 2022-06-06 10:29 218阅读 0赞 # 大数据正式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替换第一行的第三个以后的o 8. 多个匹配 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.txt 9. 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.sh 3. bash执行 base shell.sh sh shell.sh # # 例: 1. 创建Shell脚本文件vim /home/shell.sh 2. 插入 #!/bin/bash #Shows current account's home echo "current account's home is" $HOME esc -> :wq 3. ll /home/发现shell.sh没有执行的权限 4. 设置权限chmod 755 shell.sh # # #!/bin/bash #Shows system date echo $(date +%F) exit 0 1. 第一行,告诉系统如何执行脚本执行脚本,当采用直接执行(不是类似sh xxx.sh这样的方式)时,此行必须有,且要放在首行 2. 除了第一行之外的#都是注释,其他为程序部分 3. exit 0 ,以0作为该脚本的执行的返回值,执行正常退出返回0.一个脚本执行完成,之后的shell进程可以通过$?来获取执行结果 4. 命令:base mysh.sh 5. 命令:echo $? * 数值运算:简单的加减乘除 格式$(运算的内容) * 案例:两数相乘 # # #!/bin/bash #User inputs 2 integer numbers; program will cross these two read -p "first number:" num1 read -p "second number:" num2 total=$(($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/bash echo"total parameter number is==>$#" echo"your whole parameter is==>$@" #shift one parameter shift echo"total parameter number is==>$#" echo"your parameter number is==>$@" #shift three parameter shift 3 echo"total parameter number is==>$#" echo"your whole parameter is==>$*" ### 条件判断语句 ### # # if[条件判断] then if[条件判断];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 0 fi if[$1 -le $2];then echo "yes$1<=$2" exit 0 fi * 思考:read方式比较两个传参进来的数字的大小 # # #!/bin/base #compare the size of the two numbers" read -p "please input two numbers:" a b if[$a -gt $b] then echo "Yes,$a>$b" exit 0 fi if[$a -le $b];then echo "yes $a<=$b" exit 0 * 思考:实现如果/shell/scripts下面存在if3.sh就打印if3.sh存在,如果不存在就“创建”(注意目录是否存在以及不存在时的创建问题) # # #!/bin/bash FIFEPATH="/shell/scripts" if[-e "$FIFEPATH/if2.sh"];then echo "$FIFEPATH/ifs.sh is exit" fi if[!-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成立执行,指令集1 else 条件1不成立时执行指令集2; fi # # if[条件1];then 条件1成立,执行指令集1 elif[条件2];then 条件2成立,执行指令集2 else 条件都不成立,执行指令集3 fis # # 例:判断大于,等于还是小于 命令:cp ifdemo.sh if5.sh 命令:vim if5.sh #!/bin/bash #compare the size of the two numbers read -p "please input two numbers:"a b if[$a-gt$b] then echo "yes $a>$b" exit 0 elif[$a -eq $b];then echo "yes $a=$b" exit 0 else echo "yes $a<$b" exit 0 fi 测试: 命令: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 numbers if[$# -ne2];then echo "usage is :bash $0 num1 num2" exit 1; fi fi a=$1 b=$2 if[$a-gt$b] then echo "yes $a>$b" exit 0 elif[$a-eq $b];then echo "yes $a =$b" exit 0 else echo "yes $a<$b" exit 0 fi ### 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/bash while[true] do uptime#系统负载情况 sleep 2 #休眠2秒 done ctrl+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/bash i=0 until ["$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文件属性与权限 ### <table> <thead> <tr> <th>-</th> <th>rwx</th> <th>rwx</th> <th>rwx</th> <th>.2</th> <th>root</th> <th>root</th> <th>1222</th> <th>Dec 15 14.28</th> <th>install.log</th> </tr> </thead> <tbody> <tr> <td>文件类型:<br> d代表目录<br> -代表文件<br> l代表连接文件<br> b块设备<br> c字符设备</td> <td>表示有多少文件名链接到此节点</td> <td>文件拥有者权限</td> <td>文件组权限</td> <td>文件其他人权限</td> <td>文件所属人</td> <td>文件所属组</td> <td>文件大小</td> <td>文件创建时间</td> <td>文件名称,.开头的为隐藏文件</td> </tr> </tbody> </table> rwx代表[读]、[写]、[执行]的权限,若没有某个权限,则用-代替; 三个为一组,共有三组,第一组为文件所有者的权限, 第二组是同用户组的权限,第三组是其他用户的权限。 rwx的权限对应的数字为:4,2,1 rwx=4+2+1=7 r=4 rw=4+2=6 ### 改变所属用户组和权限 ### <table> <thead> <tr> <th>目的</th> <th>命令</th> </tr> </thead> <tbody> <tr> <td>改变文件所属组</td> <td>chgrp [-R] dirname/filename <br> -R如果为目录递归修改组 <br> 例如:chgrp peng install.log</td> </tr> <tr> <td>改变文件所属者</td> <td>chown [-R] 用户账号 dirname/filename <br> 或 chown [-R] 用户账号:用户组名 dirname/filename <br> 例如:chown peng:peng install.log</td> </tr> <tr> <td>改变文件的权限</td> <td>chmod [-R] mode dirname/filename <br> 例如:chmod 777 hello.java<br> 或者chomd u=rwx,g=rwx,o=rwx hello.java</td> </tr> </tbody> </table> 权限对文件的重要性: 1. 在Linux中,文件是否能被执行是由是否具有“x”这个权限来决定,与拓展名无关 2. r读取 3. w写 4. x执行 权限对目录的重要性: 1. r读取文件结构 2. 改变文件结构 3. x使用者能否进入该目录成为工作目录(工作目录就是所在的目录) ### 文件拓展名 ### <table> <tbody> <tr> <td>*.sh</td> <td>*Z,*tar,*.tar.gz,*.zip,*.tgz</td> <td>*.html,*.php</td> </tr> <tr> <td>脚本或批处理文件</td> <td>压缩文件</td> <td>网页相关的文件</td> </tr> </tbody> </table> ### Linux文件长度限制 ### * 单一文件或目录的最大容许文件名为255Bytes,(英文255的字符,中文128个字符) * 进来避免特殊字符:\*?><;&!\[\]|\\'"\`()\{\} ### 可执行文件路径的变量:$PATH ### * PATH命令由一些目录组成,每个目录由:分隔,加入到PATH中就可以直接执行这些命令 * 将某一个命令加入到PATH中 * PATH="$\{PATH\}:/root"
相关 大数据正式5 大数据正式5 常见的shell命令 管道命令 管道符| 将两个命令隔开,左边命令的输出就会作为管道右边命令的输入 连续使 旧城等待,/ 2022年06月06日 10:29/ 0 赞/ 219 阅读
相关 大数据正式2 大数据正式2 用户身份与用户组记录的文件 在Linux系统当中,默认情况下所有的系统上的账号信息都记录在/etc/passwd这个文件内(包括root用户), 快来打我*/ 2022年06月06日 08:38/ 0 赞/ 143 阅读
相关 大数据正式10 大数据正式10 jQuery 定义:jQuery是一个“写的更少”,但“做的更多”的轻量级JavaScript函数库 优势 1. 可 ゞ 浴缸里的玫瑰/ 2022年06月05日 06:24/ 0 赞/ 226 阅读
相关 大数据正式32 大数据正式32 Spring中的JDBC jar包准备 ![zW1gEQQ.png][] bean+properties普通配置 悠悠/ 2022年06月03日 08:44/ 0 赞/ 149 阅读
相关 大数据正式27 大数据正式27 Spring 先来张图简单看一下 ![oQySJMC.png][] spring框架的特点 1 悠悠/ 2022年06月03日 04:38/ 0 赞/ 129 阅读
相关 大数据正式37 大数据正式37 Maven 传统项目存在的弊端 1. 导入jar包得经验丰富 2. 传统项目打包方式不通用,不能很好的支持聚合项 左手的ㄟ右手/ 2022年06月02日 01:46/ 0 赞/ 140 阅读
相关 大数据正式36 大数据正式36 MyBatis的接口形式 注意两点 1. 接口名---namespace值对应 2. 方法名---id一致 淩亂°似流年/ 2022年06月02日 01:12/ 0 赞/ 248 阅读
相关 大数据正式34 大数据正式34 Spring+SpringMVC 小例子 效果图 ![hsIEQmd.png][] 功能说明 川长思鸟来/ 2022年06月02日 00:16/ 0 赞/ 257 阅读
还没有评论,来说两句吧...