Linux基础(五)

Linux基础(五)

1.常见的shell命令
  1.管道命令
   利用linux所提供的管道符"|"将两个命令隔开,管道符左边命令的输出就作为管道符右边命令输入
   eg:ls -al|grep Music
  2.find命令
   在一个目录(子目录)中搜索文件,可以指定一些匹配条件,按文件名,文件类型,用户甚至是时间戳查找文件
   命令格式:
    find [path] [-option]
    -path:find命令所查找的目录路径
    -print:将匹配的文件输出到标准输出
    -size:匹配文件大小
     find ./ -size 0 显示文件大小为0的文件
    -name 按照文件名查找文件
     find /-name demo 在/目录及其子目录下查找名字为demo文件
    -perm 按照文件权限来查找文件
     find . -perm 755 [-print]
    -uer 按照文件所有这来查找文件
     find ~ -user root [-print] 在~home目录中查找文件爱呢属主为root的文件
    -group 按照文件所属组来查找文件
     find / -group root [-print] 在/目录下查找属于root用户组的文件
    -mtime -n +n
     按照文件的更改时间来查找文件,-n表示更改时间距现在n天以内,+n表示文件更改时间距现在n天以前
     find / -mtime -5 -print 在系统根目录下查找更改时间在5日以内的文件
     find / -mtime +3 -print 在/目录下查找更改时间在3日以前的文件
    -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/grouops中不存在
     find / -nogroup -print
    -type 查找某一类型的文件
     b 块设备文件
     d 目录
     c 字符设备文件
     p 管道文件
     l 符号链接文件
     f 普通文件
      find /etc -type d -print 在/ect下查找所有的目录
      find . ! -type d -print 在当前目录下查找目录以外的所有类型的文件
      find /etc -type | -print 在/etc目录下查找所有的符号链接文件
     -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计
     find . -size +1000c -print 在当前目录下查找文件长度大于1000字节的文件
     find -name “20180921.txt” | xargs grep “2639090”
  3.sed命令
   非交互式文本处理工具
   sed [option] [action] [filename]
   option:
    h或–help 显示帮助
    n仅显示script处理后的结果
    V或-version 显示版本信息
    e 允许输入数据应用多条sed命令进行编辑
    f 直接将sed的动作写在一个文件内 -f filename则可以运行 filename内的sed动作
    sed 之action
     s 字符串替换
     i 插入
     d 删除
     a 追加
     c 替换
     p 打印指定的输出行
     eg: 创建:demo.txt
     sed “s/wuxinhadoop/hadoop/g” demo.txt
      s 表示替换命令
      /wuxinhadoop/表示匹配wuxinhadoop
      /hadoop/表示把匹配替换成hadoop
      /g 表示一行上的替换所有匹配
     如果要写回文件可以使用重定向
      sed “s/wuxinhadoop/hadoop/g” demo.txt > demo2.txt
     如果想修改源文件内容使用参数 -i
      sed -i “s/wuxinhadoop/hadoop/g” demo.txt
     只替换三行
      sed “3s/wuxinhadoop/hadoop/g” demo.txt
    替换第一到第二行的文本
     sed “1,2s/wuxinhadoop/hadoop/g” demo.txt
    替换每一行的第一个l
     sed “s/l/L/1” demo.txt
    替换每行第二个l
     sed “s/l/L/2” demo.txt
    替换第一行的第三个及以后的o
     sed “1s/o/O/3g” demo.txt
    多个匹配 如果需要一次替换多个模式
     第一种方式  sed ‘s/l/L/1;s/o/O/3g’ demo.txt
     第二种方式 sed -e ‘s/l/L/1’ -e ‘s/o/O/3g’ demo.txt
    a动作和i动作
     a动作就是append i动作就是Insert 它们是用来添加行的
     使用n i 添加一行,在第一行添加
     sed “1 i hi word” demo.txt
     使用n a 追加一行,在第一行后面追加
     d 动作删除匹配行  sed “/hdfs/d” demo.txt
   4.grep命令 全面搜索正则表达式并把行打印出来
     grep [options] pattern [file]
      -n 同时显示匹配行上下的n行
      grep -2 pattern filename同时显示匹配行的上下2行
     grep 
      -b --byte-offset 打印匹配行前面打印改行所在的块号码
      -c --count 只打印匹配的行数,不显示匹配的内容
      -f File,–file=File 从文件中提取模板,空文件中包含0个模板,所以什么都不匹配
      -h --no-filename 当搜索多个文件时,不显匹配文件名前缀
      -i --ignore-case 忽略大小写差别
      -q --qiuet 取消显示,只返回退出状态,0则表示找到了匹配的行
      -n --line-number 在匹配的行前面打印行号
      -v --revert-match 反检索,只显示不匹配的行
   5.tail命令 把某个档案文件的最后几行显示到终端上,如果该文件有更新,tail会自动刷新,确保看到最新的文件内容
    tail [-F] [-c Number| -n Number |-m Number|-b Number|-k Number][File]
    -F 该参数用于监视File文件增长
    -c Number从Number 字节位置读取指定文件
    -n Number 从Number 行位置读取指定文件
    -m Number 从Number 字符位置读取指定文件,比如文件中包含中文字,如果指定-c参数可能导致截断,但使用-m则会避免该问题
    -b Number 表示的512字节块位置读取指定文件
    -k Number 表示1KB块位置读取指定文件
    file 指定操作的目标文件名
    当涉及到number 如果不指定,默认显示10行,Number前面可使用正负号,表示该偏移从顶部还是尾部开始计算
    eg:
     tail -F filename
     tail -n 20 finame 显示filename最后20行
     tail -n +20 filename 不包含前19行,从第20行开始显示
   6.sort 默认情况下按照字符排序
    -n 按照数值排序
    -u 不出现重复的行
    -t 指定分段的符号
    -k 指定的第几个段
    -r 逆向排序
    sort -r demo > d1
    sort -t “.” -k 4 demo 对文件进行指定分隔符,并对第四个字段排序
   7.cut 负责剪切数据用的
    cut [-option] filename
     -b 字节
     -c 字符
     -f 要提取第几列
     -d 按指定分隔符分隔列
     cut -b 2 demo 每一行第二个字节
     cut -b 5-7 demo 每一行第五个到第七个字节
     cut -b 9- demo 第九个字节之后
     cut -b -9 demo 第九个字节之前
     cut -d . -f 2 demo 以点为分隔符获取第二个字段
     cut -d . -f 1 demo 以点为分隔符获取第一个字段
   8.history 显示执行过的命令
    history 5 显示执行过的上5条命令
    !! 运行上一条命令
    !88 /test 运行第88条命令并子啊命令后面加上/test
    !ls 运行上一个ls命令
    !ls:s/CF/l 运行上一个ls命令,其中把CF替换成l
    fc 编辑并运行上一个历史命令
    fc 66 编辑并运行第66个历史命令
    fc -e /usr/bin/vim 66 使用vim 编辑第66个命令并运行
    搜索历史命令
     使用ctrl+r搜索 历史中的字符串,重换ctrl+r可以在历史命令列表中不断的向前搜索包含字符串的命令,回车就会执行查找的命令
    清空历史命令 history -c
二、shell高级
  1.注意事项
   1.命令的执行是从上而下,从左而右执行
   2.空白行也被忽略掉,tab被视为空格
   3.如果读取一个enter符号(CR),就尝试开始执行该命令
   4.#后面内容为注释
  2.执行脚本三种方式
   1.直接执行 ./shell.sh 必须具备可执行权限
   2.source 执行 source shell.sh
   3.bash执行 bash shell.sh
   sh shell.sh
  3.数值运算
   格式:$((运算内容))

	#!/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  ==> $total"
	 exit 0

4.test判断命令
    test -e demo.txt
     -e 该文件是否存在
     -f 该文件是否存在且为文件(file)
     -d 该文件名是否存在且为目录(directory)
     -b 该文件是否存在且为一个block device装置
     -c 该文件是否存在且为一个character device装置
     -S 该文件是否存在且为一个 Socket文件
     -p 该文件是否存在且为一个 FIFO文件
     -L 该文件是否存在且为一个链接文件
    判断文件权限
     -r 检查该文件是否存在且具有可读权限
     -w 检查该文件是否存在且具有可写权限
     -x 检查该文件是否存在且具有可执行权限
     -s 检查该文件是否存在且为非空文件
     -u 检查该文件是否存在且具有SUID的属性
     -g 检查该文件是否存在且具有SGID的属性
    判断字符串
     test -z String 判断字符串是否为空?若string为空字符串则为true
     test -n string 判断字符串是否为空?若string为空字符串则为false
     test str1=str2 或 == 判断str1是否等于str2 若相等,则返回true
     test str1!=str2 判断str1 是否不等于str2若相等,则返回false
    两个文件之间比较
     -nt 判断file1 是否比file2 新
     -ot 判断file1 是否比 file2 旧
     -ef 判断两个文件是否为同一个文件
    5.判断符号[]基本和test相同
     1. !=和等等于用于比较字符串
     2.整数比较只能使用-eq,-gt,ge,lt,le这种形式
     3.[]中的逻辑与和逻辑或使用-a和-o 表示
     4.&&,||,<和>操作符如果出现在[]结构中的话会报错
    6.shell script参数
     /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             0 程序文件名         # 共有几个参数
       若参数的个数小于(lt)2则告知使用者参数数量太少
       全部参数内容是什么 $ @
        第一个参数 $1
        第二个参数 $2
        shift 造成参数变量号码偏移
    7.条件判断语句
       if [条件判断]
      then
      //命令
     fi
     if[条件判断]; then 条件成立执行,命令;
     fi 将if 反过来写就成为fi 结束if语句
     2.双分支结构
      if [ 条件1 ]; then 条件一成立执行,指令集1
      else 条件1不成立执行指令集2 fi
     3.多分支结构
      if [ 条件1 ]; then 条件1成立,执行指令1
      elif [ 条件2 ]; then 条件2成立 执行指令集2
      else 条件都不成立 执行指令集3 fi
     4.case结构条件语句
      case $变量名称 in “值1”)
      程序段1
      ;;
      “值2”)
      程序段2
      ;;
      *)
       exit 1
       ;;
       esac
      eg:

		#!/bin/bash
		read -p "please input a int ([1,7])": num
		case $num in 1)
		  echo "Mon"
		;;
		2)
		  echo "Tue"
		;;
		3)
		  echo "Wed"
		;;
		4)
		  echo "Thu"
		;;
		5)
		  echo "Fir"
		;;
		[6-7])
		 echo "weekday"
		;;
		*)
		 echo "input [1,7]"
		 exit 1
		esac
		exit 0

8.函数
    function fname(){
     命令
    }
   9.shell script
    sh [-nx] scirpt.sh
    -n 不执行script 仅查询语法问题
    -v 在执行script前,先将script 的内容输出到屏幕上
    -x 将使用到的script内容显示到屏幕上,这是很有用的参数!!
   10.循环语句
    1.不定循环
     while do done,until do done
    2.固定循环
     for … do done
    3.while
     while [ condition ] ; do 
     命令 
     done
     或者 
     while [ condition ]
     do
     命令
     done
    4.until
     util [ condition ];do
     命令
     done
     或者
     until [ condition ]
     do
     命令
     done
    eg:

		#!/bin/bash
		i=0
		until [ $i -gt 5 ]
		  do
		  let square=i*i
		  echo "$i*$i=$square"
		  let i++
		done

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

	1.for循环
      for num in 5 4 3 2 1
      do
      echo $num
      done

2.大括号方法
     echo {1…5}
    3.使用seq -s 分隔符 起始 不长 终点
     seq -s " " 5 -1 1
     4.课件分发

		vim send.sh
		#!/bin/bash
		for ip in `cat /root/ips.txt`
		do
		scp/root/epel.rpm root@${ip}:/root
		Done
		esc:->wq->chmod777 send.sh
		文件ips.txt内容:
		192.168.80.10
		192.168.80.90

11.定时任务
   分 小时 日 月 星期 命令
   10 0-23 1-31 1-12 0-6 command(取值范围,0表示周日一般一样对应一个任务)
   几个特殊符号的含义:
    "*"代表取值范围内的数字
    "/“代表"每”
    "-"代表从某个数字到某个数字
    “,” 分开几个离散的数字
    eg:
     */1 * * * * root /home/day05/sh/send.sh
    如果没有生效,解决办法:首先得确定,脚本写的是否正确,shell脚本是否拥有执行权限。一切正常还不能执行的话,就用以下方法:使root用户的crontab生效 crontab-u root /var/spool/cron/root
    重启crontab服务 service crondrestart
    crontab -l 查看定时任务
    crontab -e 编辑定时任务
   命令参数:
    -u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
    file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
    -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
    -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
    -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
    -i:在删除用户的crontab文件时给确认提示。

猜你喜欢

转载自blog.csdn.net/qq_38019655/article/details/83895291