基本命令+环境变量+正则表达式 --- shell脚本编程教程之一

# vim !$
单纯的使用vi查看文件

shell 编程常见的命令:

alias : 别名 给一长命令起别名

例如:alias myssh="ssh [email protected]"

# myssh

相当于 : ssh [email protected]

取消myssh别名:

unalias myssh


通配符: * []  ?

# ls *

# 1.txt  2.txt

# ls [12].txt     // 中括号里面的表示任选其一

# ls ?.txt         // 只表示一个


重定向:

>    >>   <  2>  2>>    

2>     错误重定向

2>>   追加错误重定向

例如:

管道: |

# ls | Xargs

前面命令的输出 作为管道后面的输入


jobs  fg


变量:

env : 可以列出当前用户的所有变量(全局的)

env | grep "^a" 从管道中列出以a开头的变量  ^ 表示以什么开头

a=1  shell编程不能有空格

变量名不能以数字开头

变量名的组成:大小写字母(Aa)  数字(1 2 3) 下划线(_)     数字不能开头

有特殊符号 需要单引号(' ')  或者双引号(" ") 引起来

单引号 的为例更大

 a="ubuntu linux"

反引号 ``

程序对比

b=`echo $a`

c='echo $a'

d="echo"

然后,可以对比b,c,d的结果 有什么不同

变量可以叠加:

b=$a"123"

c=$a$b

d=$a123  // 将a123看作了一个整体


取消一个变量:

# unset a


echo $PS1

定义命令行的 固定开头的东西

.  == source   使文件生效

su -   // 重新登录root用户


wc 查看行数


cut :用于分割

cut -d  ':' -f 2 /etc/passwad

cut -c 2-5 /etc/passwd


sort  排序

 



wc 统计行数 单词 字符数
wc -l 4.txt 行数
cat -A 2.txt 可以将空格打印出来

line=`wc -l 4.txt | cutr -d ' ' -f2`;echo $line

uniq -c 将重复的行统计出来
cat 1.txt | tee 1.log 重定向到屏幕和1.log文件
tr 将字目进行转换
ls 1.txt | tr 'a-z' 'A-Z'

分割:
for i in `seq 1 10000` ; do cat /etc/passwd >> 1.txt ; done

du -sb /etc/passwd

split -l 10000 1.txt #将1.txt文件分割成10000行的多个文件

qplit -b 1M 1.txt    #按照1M进行分割1.txt文件

ls * | xargs -i mv {} {}.txt #统一添加后缀名 i 表示一行一行输出

cd /tmp && ls   #&&两个命令全部执行 并且第一个命令执行成功则执行后边的命令

cd /tmp || ls   # || 或的关系 第一个执行不成功 则后边的命令可以执行

cd /tmp ; ls     # ; 两个命令都执行 不管成功与否

正则表达式

grep egrep

grep -c 'mysql' 1.txt 统计1.txt的mysql的次数
grep -n --color 'root' 1.txt  显示行号 显示颜色
grep -o 'root' 1.txt | wc -l 统计次数
alias grep='grep --color' 输入麻烦 起别名
grep 'root'
grep -v root' 1.txt 取反
grep -A2 -n 'root' 1.txt 把下面的两行打印出来
grep -B2 -n 'root' 1.txt   上
grep -C2 -n 'root' 1.txt   上下
grep -r 'root' /etc/      遍历一个目录下的所有文件

表示数字: [0-9]
grep '^#' -n 1.txt 列出所有以#开头的行
grep 'n$' -n 1.txt 列出所有以n结尾的行
grep '^$' -n 1.txt 列出空行
grep -n '^[a-zA-Z]' 1.txt 列出所有以字母开头的行
grep -n '^[^0-9]' 1.txt  非数字开头的列

正则表达式中的特殊符号
* . ? + {} \

grep 'ro*t' 1.txt     # * 表示0个或多个*前面的字符
grep 'ro.t' 1.txt     # . 表示任意一个字符
grep -E 'ro?t' 1.txt  # ? 表示0个或1个?前面的字符
grep -E 'ro+t' 1.txt  # + 表示1个或多个+前面的字符
grep  'ro.*t' 1.txt   # .* 表示统配 贪婪匹配    

o* (oo)*
grep -E "(oo){2}" 1.txt 匹配出现2次或者2次以上的

查找/替换:sed
sed '1p' -n 1.txt                  # 打印第一行
grep -n '.*' 1.txt | sed '1,5p' -n # 打印1-5行 并打印
grep -n '.*' 1.txt | sed '/root/p' -n # 输出包含root的行
grep -n '.*' 1.txt | sed '/ro*t/p' -n
grep -n '.*' 1.txt | sed '/ro\+t/p' -n    ==  grep -n '.*' 1.txt | sed -r '/ro+t/p' -n
grep -n '.*' 1.txt | sed '/ro\?t/p' -n    ==  grep -n '.*' 1.txt | sed -r '/ro?t/p' -n

grep -n '.*' 1.txt | sed -e '/root/p' -e'/mysql/p' -n  包含root或者mysql  # 先匹配root如果包含输出 再去mysql如果包含mysql继续输出 如果一个行即包含root2baohan mysql 则输出2次 == grep -n '.*' 1.txt | sed '/root/p;/mysql/p' -n
grep -n '.*' 1.txt | sed '/ro[o|t]t/p' -n # 中括号三选一 即 o | t
sed 删除
grep -n '.*' 1.txt | sed '1,5d' 删除1-5行
grep -n '.*' 1.txt | sed -r '/[0-9]/d' 删除所有含有数字的行
grep -n '.*' 1.txt | sed -r '/[^0-9]/d'删除所有数字开头的行
sed 替换
grep -n '.*' 1.txt | sed 's/root/toor/g' 将root替换成toor
grep -n '.*' 1.txt | sed '1,10s/root/toor/g' 将1-10行进行替换
grep -n '.*' 1.txt | sed 's/[0-9]//g'   删除数字
grep -n '.*' 1.txt | sed 's/[^0-9]//g'  删除非数字
head 1.txt | sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' 使用-r不用转义
             将一行分割    1     2     3     /将前边的1,2,3部分使用'\'进行随意的调换顺序

sed -i 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' 1.txt 可以同时修改文本(-i)

awk -F ':' # : 分隔符
awk -F 'sbin' '{print $2}' 1.txt  以sbin为分隔符 输出第二个
awk -F ':' '$1~/root/' 1.txt      有分隔符之后可以精准匹配
                                  分割出来的第一部分含有root的

awk -F ':' '$1~/root/ {print $3,$4}' 1.txt 匹配之后打印第3,4部分
awk -F ':' '1~/root/ {print $0}' 1.txt     $0 表示整行
awk -F ':' '$1~/root/ {OFS="#";print $1,$2}' 1.txt
            条件       输出的分隔符
awk -F ':' '$1=="root" {print $1,$2}' 1.txt 严格匹配 第一部分等于root
"或者"的条件
awk -F ':' '$1=="root" || NR>30 {print $1,$2}' 1.txt # NR>30 大于30行
                      # || 表示或者 $1等于root 或者 行号大于30行
"并且"的条件
awk -F ':' '$1=="root" && NR>30 {print $1,$2}' 1.txt
                      # && 表示并且 $1等于root 并且行号大于30

awk -F ':' '$1=$3+$4 {print}' 1.txt
                      # 第1部分=第3部分+第4部分 替换掉第一部分

awk -F ':' 'NF>3 && NF<10 {print}' 1.txt  # NF 分割的段数
awk -F ':' '$1=1 {OFS=":"; print $0}' 1.txt # 将第1段进行替换 结构发生了改变 需要重新指定分隔符

awk -F ':' '{OFS="####";print $NR,$NF}' 1.txt # NR行数 NF段数

正则表达式的要点:
'.'  a.
'*'  a* == a aa aaa ....
'+'  grep -E 'a+' == grep 'a\+'
'?'  grep -E 'a?' == grep 'a\?'
'.*'
()   
|    grep -E 'a|b' 或者

{}   grep -E '(oo){2}' 出现2次
([^:]+) 非冒号 一个或多个
(:.*:)  从第一个冒号到最后一个冒号
([^:]+$)非冒号
sed -r '/([^:]+)(:.*:)([^:]+$)/\3\2\1' 1.txt 第1个和最后1个交换
 

你可能感兴趣的:(Shell)