Linux shell 学习

Shell 特性:

     history 保存在 ~/.bash_hostory,保留1000条:定义在

          echo $HISTSIZE

     !!: 上一条命令

     !$: 上一条命令的最后一个参数

     !950: 第950条命令

     !c: 历史中最近的以 c 开头的命令

     tab: 命令补全

     alias: 别名   unalias 

     *,?: 通配符  正则表达式

     |: 管道符

     >,>>: 重定向跟追加

     2>: 错误重定向   2&1>: 整齐跟错误重定向

     sleep,fg,bg,jobs: fg后面加个数字ID

     

Shell 变量:

     env: 查看系统变量

     set: 系统跟自定义变量

     变量中带有特殊字符,需要用单引号 : b='ls /tmp'

     变量中引用命令,用反引号 : myvim=`which vim`

     变量之间的连接,用双引号 : c="$a"12

     export : 变量全局声明

     local : 变量局部定义

     unset d : 删除一个变量的值

Shell 环境变量:

    系统级别:

     /etc/profile : /etc/profile.d/*.sh

     /etc/bashrc :

          1) /etc/profile.d/*.sh

          2) PS1='[\u@\h-\t \w(W)]\$ '

          3) umask 修改

               umask.sh : umask 0012

      用户级别:

     .bash_history : 记录历史命令

     .bash_logout : 退出的时候所做的事

     .bash_profile : 用户自己环境变量配置文件

     .bashrc : root用户用到的别名

     

Shell 基本用法之 cut :

     cat /etc/passwd | cut -d ':' -f 1 | head -n5  (以:分割的第一段数据的前5条)

     head -n2 /etc/passwd | cut -c2  (截取第二个字符)

     head -n2 /etc/passwd | cut -c1-5   (截取第1-5个字符)

Shell 基本用法之 sort :

     head -n5 /etc/passwd | sort : 升序

     head -n5 /etc/passwd | sort -t: -k3 -n : 使用纯数字以第三个字段来排序

     head -n5 /etc/passwd | sort -t: -k3,5 -r : 从第三到第五字段之间的字符串进行反向排序

     cut -d : -f1 /etc/passwd | sort -n -u : -nu 会把字符串都看成0 ,并且去重

    

Shell 基本用法之 wc:

     wc -l 1.txt 2.txt : 列出有几行

     wc -w (word)   : 输出以空格为分割的多少个字

     echo "12345" | wc -m : 输出多少字符

Shell 基本用法之 uniq 和 tee:

     uniq +文件 : 去重

     sort +文件 | uniq -c : 只有相互挨着的两行相同才会去重,-c是可以计算重复的行数

     echo "1213" | tee +文件 : 重定向并且把结果显示在屏幕上

      

Shell 基本用法之 tr和 split:

     head -n2 /etc/passwd | tr '[a-z]' '[A-Z]' : 把小写转化为大写

     -d : 删除某个字符; -s : 去除重复的字符

     

     split -b500 passwd : 将文件以500bytes 为一个文件分割,默认不指定目标文件,则会产生xaa,xab,xac... 文件来显示

     split -l 10 +文件: 将文件以10行为单位来进行分割

     split -b 500 + 文件 123: 指定目标文件名,则会以123aa,123ab,123ac...来显示

     

Shell 基本用法之 grep : 

     grep :

          1) . -c : 打印符合要求的行数

          2) . -n : 输出行号

          3) . --color : 显示颜色

          4) . -v : 打印不符合要求的行

          5) . -A+数字 : 显示符合要求的行以及下面n行

          6) . -B+数字 : 显示符合要求的行以及上面n行

          7) . -C+数字 : 显示符合要求的行以及上下各n行

          8) . -rh : 访问目录 grep -rh "iptables" /etc/*

          9) . --include : 包含某个文件

                    把一个目录下,过滤所有*.php 文档中含有eval 的行

                    grep -r --include="*.php" 'eval' /data/

     egrep = grep -E

Shell 基本用法之 sed :

     sed '10'p -n 1.txt : 加上-n 打印出符合规则的行

     sed -n '/root/'p 1.txt : 打印包含特殊字符的行

     -r : sed 不能识别 +| {} () 等符号,需要脱义字符\或者-r 

          sed -n -r '/ro+/'p 1.txt

          sed -n '/ro\+/'p 1.txt

     -e : 实现多个任务,也可以用 ; 来实现

          sed -e '/root/p' -e '/body/p' -n 1.txt

     d : 删除指定行

          sed '/root/d' 1.txt ; sed '1d' 1.txt ; sed '1,10d' 1.txt

     s : 替换

          sed '1,2s/ot/to/g' 1.txt

     替换两个字符串的位置,其中\3\2\1分别代表三个()的内容

          head -n2 1.txt | sed -r 's/(root)(.*)(bash)/\3\2\1/'

     a:指定行后面添加

          sed '2,4a abcd' xx.txt 在2到4行添加 abcd

     -i : 直接修改文件

          sed -i 's/ot/to/g' 1.txt

Shell 基本用法之 awk:

     1. awk -F ':' '{print $1}' 1.txt

     2. awk -F ':' '{OFS="#"} {print $1,$2,$3,$4}' 1.txt 就是 

               awk -F ':' '{print $1#$2#$3#$4}' 1.txt

     3. awk '/oo/' 1.txt  : 匹配oo

     4. awk -F ':' '$1 ~/oo/' 1.txt  : 在第一段匹配oo

     5. 条件操作符 ==,>,<,!=,>=,<=

          第三段为0 : awk -F ':' '$3=="0"' 1.txt

          第三段大于等于500 : awk -F ':' '$3>=500' 1.txt

          第七段不是'/sbin/nologin' : awk -F ':' '$7!="/sbin/nologin"' 1.txt

          

     6. awk 内置变量NF (段数) NR (行数)

          head -n3 1.txt | awk -F ':' '{print NF}'

     7. 数学计算:

          awk -F ':' '{OFS=":"}{$7=$3+$4; print $0}' 1.txt

     8. awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt

     9. awk -F ':' '{if ($1=="root") print $0}' 1.txt

Shell 基本语法:

1) #!/bin/bash 指定用bash 来运行

2) if 语句

     if condition ; then

          command

     fi

     

     if condition ; then

          command

     else

          command

     fi

     

     if condition ; then

          command

     elif condition; then

          command

     else

          command

     fi

3) [ 条件 ] 

     -d : 是否为目录

     -f :  是否为普通文件

     -l :  是否为连接文件

     -e : 是否存在

     -n : 是否不为0

     -z : 是否为0

     -r (-w -x):是否有权限

     

4) for 跟 while

     for i in `seq 1 5` do

          echo $i

     done

     

     while condition; do

          command

     done

     死循环:

     while :; do

          command

          sleep 3

     done

     continue; break; exit;

5) date 命令

     1) 2015-08-25 : date +%Y-%m-%d

     2) 15-08-25 : date +%y-%m-%d

     3) date +%F

     4) 21:45:15 : date +%H:%M:%S

     5) 21:45:15 : date +%T

     6) 时间戳 : date +%s

     7) date -d @1440510413

     8) 一天后 : date -d "+1day"

     9) 一天前 : date -d "-1day"

     10) 一月前 : date -d "-1month"

     11) 一分钟前 : date -d "-1min"

     12) 星期 : date +%w(%W) 小写表示周几,大写表示本年的第几周

6) 数学运算

     sum = $[$a+$b] (+-*/)

     小数:echo "scale=2;10/3" | bc    输出3.33

  

7) 交互

     read -p "Please input a number :" x

8) sh -x xx.sh查看执行过程

9)  case 语法

     case 变量 in 

     value1)

          command

          ;;

     value2)

          command

          ;;

     *)

          command

          ;;

     esac

10) Shell 数组

     a=(1,2,3,4)

     数组元素个数:echo ${#a[@]}

     读取单个元素:echo ${a[2]}

     打印整个数组:echo ${a[@]}  或者 echo ${a[*]}

     删除数组:unset a    unset a[1]

     数组分片:echo ${a[@]:0:3} 从下表0往后3个

     数组替换:echo ${a[@]/3/100} 将数组第三个换成100


你可能感兴趣的:(linux,shell,学习)