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