# 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个交换