Shell编程

一. 命令历史history与!

1. 上一条命令
   !!
2. 命令历史上一条命令的最后一个参数
   !$
3. 运行历史命令的555行
   !555
4. 命令历史自底向上运行以vi开头的命令
   !vi

二. alias别名

1. 设置别名
alias lx='ls'
2. 取消别名
unalias lx

三. 通配符号

1. 零个或多个
*
2. 选其中一个
[12]
3. 一个任意的字符
?

四. 重定向

1. 清空filename文件
> filename
2. 写"111"到filename
echo "111" > filename
3. "111"追加到filename
echo "111" >> filename
4. 反向重定向,把1.txt的内容反向重定向到cat
cat < 1.txt 5. lishiming文件不存在,把错误信息输出到error.log日志

ls lishiming 2> error.log
ls lishiming 2>> error.log
6. sss.sh脚本的正确运行结果输出到1.log,错误信息输出到1.log
sh sss.sh > 1.log  2>1.log
sh sss.sh > 1.log  2>>&1

五. 管道
前一个命令的输出作为后一个命令的参数

1. 把当前目录内容输出成一行
ls | xargs

六. 作业控制ctrl+z,jobs, fg, bg

1. 休息100s
sleep 100
2. 休息200s
sleep 200
3. 查询Jobs,列出上述两个任务
jobs
4. 进入任务1
fg 1
5. 进入任务2
fg 2

1

[1]-

[2]+

[2]后面的”+”表示优先级高

七. 变量

1. env ,查找环境变量中以a开头的环境变量

env | grep '^a'

2. set, 列出用户自定义的变量
3. 变量只能有数字,字母,  下划线组成,不能以数字开头
4. 反引号

#反引号,为了引用which vim命令的结果
rpm -qf  `which vim`

5. 单引号、双引号、反引号

a="hello world"
b='echo $a'
c="echo $a"
d=`echo $a`
echo $b  #打印结果为echo $a
echo $c  #打印结果为echo hello world
echo $d  #打印结果为hello world

单引号最严格
双引号将命令的结果作为变量打印
反引号,输出命令执行结果

八.环境变量
/etc/profile /etc/bashrc ~/.bashrc ~./bash_profile

九.特殊符号
& && > >> []
十.命令
1. cut分隔

#以冒号为分隔符,打印第一段
cut -d ':' -f 1 /etc/passwd
#以冒号为分隔符,打印第一到三段
cut -d ':' -f 1-3 /etc/passwd
#第2到10列
cut -c 2-10 /etc/passwd

2. sort排序

#以第三段为基准排序,默认按ascii码排序
sort -t ':' -k3 /etc/passwd
#以第三段为基准排序,数字大小排序
sort -t ':' -k3 -n /etc/passwd
#以第三段为基准排序,数字大小排序,最后只要第三段
sort -t ':' -k3 -n /etc/passwd | cut -d ':' -f 3
#截取文件第3列,以数字大小逆向排序
cut -d ':' -f 3 /etc/passwd | sort -nr
#截取文件第3列,以数字大小逆向排序,去掉重复项,然后统计频次
cut -d ':' -f 3 /etc/passwd | sort -nr|uniq -c

3. wc 单词统计

# 69指行数,408指单词数,3469指字符数
wc npm-debug.log
 69 408 3469 npm-debug.log
#打印npm-debug.log文件的行数
wc -l npm-debug.log
#如果npm-debug.log文件行数小于3行,打印no
line=`wc -l npm-debug.log|cut -d ' ' -f1`; echo $line
if [ $line -lt "3" ]; then echo "no"; fi

4. uniq
5. tee 重定向。重定向的同时,还把结果输出到屏幕上。
6. tr替换

#把文件名中的小写字母替换为大写字母
ls |tr 'a-z' 'A-Z'

7. split切割

# 将passwd文件内容写一万次到1.txt,然后用split命令分割成一万份
for i in `seq 1 10000`; do cat /etc/passwd >> 1.txt ; done
split -l 10000 1.txt
#分割后的文件以a开头
split -l 10000 1.txt a
#把a开头的文件,在文件名后加上.txt
ls a* |xargs -i mv {} {}.txt

8. xargs -i 加-i 参数直接用{}就能代替管道之前的标准输出的内容
9. du查看文件大小

#查看1.txt文件的大小  cp /etc/passwd 1.txt
du -sh 1.txt

10. grep/egrep

# -c 打印符合要求的行数
grep -c  'mysql' 1.txt
# -n 在输出符合要求的行的同时连同行号一起输出
grep -n ':x' 1.txt
# -v 打印不符合要求的行
grep -v 'root' 1.txt
# -A2 打印符合要求的行以及下面两行(A表示after)
grep -A2 -n 'root' 1.txt
# -B2 打印符合要求的行以及上面两行
grep -B2 -n 'root' 1.txt
# -C2 表示打印符合要求的行以及上下各两行
grep -C2 -n 'root' 1.txt
# -r 把目录下面所有的文件全部遍历
grep -r 'root' /etc/
# 过滤出所有包含数字的行
grep '[0-9]' 1.txt
# 过滤出所有不包含数字的行
grep -v '[0-9]' 1.txt
# 去除所有以'#'开头的行
grep -v '^#' 1.txt
# 去除所有空行和以'#'开头的行 '^$'表示空行
grep -v '^$' 1.txt | grep -v '^#'
# '[^a-z]'中^表示非,过滤掉a-z开头的行
grep '^[^a-z]' 1.txt

十一.正则表达式

* . ? + {} \ 
ls *.txt
# *,匹配零个或多个o
grep 'ro*t' 1.txt
# .,匹配1个或多个o
grep 'ro.t' 1.txt
# -E让?变得可用,也可用egrep,?表示匹配零个或一个字符
grep -E 'ro?t' 1.txt
# +,匹配1个或多个o
egrep 'ro+t' 1.txt
# * 0个或多个*前面的字符
# . 任意一个字符
# ? 0个或1个?前面的字符
# + 1个或多个+前面的字符
# .* 零个或多个字符 贪婪匹配