一、shell特性
1、history !! !$ !n !str
2、tab 命令补全
3、alias 和 unalias
4、通配符 * ? [ ]
5、输入输出重定向 >, >>, <, << , 2>, 2>>, &>,&>>
二、变量
1、系统变量 set env export
2、变量命名规则
3、取消变量 unset
4、变量引用:`` ' ' " "
三、系统和个人环境变量的配置文件
四、shell中的特殊字符 * ? # \ | $ ; & && ||
五、常用命令 cut,sort,wc,uniq, tree ,tr,split
一、shell特性
1、history 命令历史 (history 10 -c !! !$ !n !vi)
history 10 只列出最近10条记录
history -c 清空历史命令
!! 执行上一条命令
!$ 上一条命令的最后一个参数
!n 第多少条命令
!vi 最近一条以vi开头的命令
2、tab 命令补全
3、alias vi=vim 取消:unalias myssh
永久生效,修改/root/.bashrc
myssh='ssh -i /root/.ssh/1.txt'
4、*通配所有字符 ?一个任意字符 [ ]之间的一个字符
***************************
[root@localhost tmp]# touch 1.txt 2.txt 111.txt 222.txt
[root@localhost tmp]# ls *
111.txt 1.txt 222.txt 2.txt
[root@localhost tmp]# ls 1?.txt
ls: 无法访问1?.txt: 没有那个文件或目录
[root@localhost tmp]# ls ?.txt
1.txt 2.txt
[root@localhost tmp]# ls [12].txt
1.txt 2.txt
[root@localhost tmp]# ls [12]*.txt
111.txt 1.txt 222.txt 2.txt
[root@localhost tmp]# ls [12]?.txt
ls: 无法访问[12]?.txt: 没有那个文件或目录
[root@localhost tmp]# ls [12]??.txt
111.txt 222.txt
[root@localhost tmp]# ls [1-9].txt
1.txt 2.txt
***********************************
5、 输入输出重定向
> ,>>,<,2>,2>> ,&>,&>>
&>1.txt 正确和错误重定向到1.txt
&>>1.txt 正确和错误追加到1.txt
***********************************
[root@localhost tmp]# cat 1.txt
[root@localhost tmp]# echo 111 >1.txt
[root@localhost tmp]# cat <1.txt
111
[root@localhost tmp]# cat 1.txt
111
[root@localhost tmp]# mail -s "test" [email protected] < 1.txt 发送邮件
[root@localhost tmp]# for i in `seq 1 10000` ; do cat /etc/passwd > 1.txt ;done
[root@localhost tmp]# ls /root
1.sh 2015-03-24.log 3.sh 5.sh 7.sh anaconda-ks.cfg install.log iptables php-5.3.27.tar.gz shift.sh
1.txt 2.sh 4.sh 6.sh 8.sh httpd-2.2.16.tar.gz install.log.syslog LinuxICv35.iso sdb1 sh.zip
[root@localhost tmp]# ls /tmp
111.txt 1.txt 222.txt 2.txt a0 a1 a2 a3 a4 a5 a6 a7
[root@localhost tmp]# ls /tmp | xargs // 将回车和制表符 转成空格符
111.txt 1.txt 222.txt 2.txt a0 a1 a2 a3 a4 a5 a6 a7
[root@localhost tmp]# ls
111.txt 1.txt 222.txt 2.txt a0 a1 a2 a3 a4 a5 a6 a7
[root@localhost tmp]# ls a* | xargs -i mv {} {}.txt // 将an文件重名为an.txt
[root@localhost tmp]# ls
111.txt 1.txt 222.txt 2.txt a0.txt a1.txt a2.txt a3.txt a4.txt a5.txt a6.txt a7.txt
*****************************
5、sleep 100
sleep 200
sleep 300
jobs
fg
bg
ctrl + z 暂停
ctrl + c 终止
********************************
[root@localhost tmp]# sleep 100
^Z
[1]+ Stopped sleep 100
[root@localhost tmp]# sleep 200 &
[2] 20568
[root@localhost tmp]# sleep 300 &
[3] 20569
[root@localhost tmp]# jobs
[1]+ Stopped sleep 100
[2] Running sleep 200 &
[3]- Running sleep 300 &
[root@localhost tmp]# fg
sleep 100
^Z
[1]+ Stopped sleep 100
[root@localhost tmp]# bg
[1]+ sleep 100 &
[root@localhost tmp]# bg 1
-bash: bg: job 1 already in background
***********************************
二、变量
1、 系统变量: HONME PATH LANG HOSTNAME
env 系统内置变量 (它也可以列出全局变量)
set 显示所有变量 (也包括自定义变量)
****************本地变量******************
[root@localhost tmp]# a=1
[root@localhost tmp]# echo $a
1
[root@localhost tmp]# bash
[root@localhost tmp]# echo $a
[root@localhost tmp]# set | grep ^a
[root@localhost tmp]# exit
[root@localhost tmp]# set |grep ^a
a=1
****************************************
[root@localhost ~]# export a=1
[root@localhost ~]# env | grep ^a
a=1
[root@localhost ~]# bash
[root@localhost ~]# echo $a
1
[root@localhost ~]# echo $b
[root@localhost ~]#
******************************************
2、变量名规则:
a、变量名=值 中间没有空格
[root@localhost ~]# a = 1
-bash: a: command not found
[root@localhost ~]# a=1
[root@localhost ~]#
b、变量名不能以数字开头
[root@localhost ~]# 3a=1
-bash: 3a=1: command not found
[root@localhost ~]# a3=1
[root@localhost ~]#
c、变量名只能以大小写,数字和下划线。 但不能以数字开头
[root@localhost ~]# a=1
[root@localhost ~]# echo $a
1
[root@localhost ~]# unset a
[root@localhost ~]# echo $a
[root@localhost ~]#
3、取消变量 unset a
4、` ` 反引号引用命令的结果
[root@localhost ~]# rpm -qf `which vi`
vim-minimal-7.2.411-1.8.el6.x86_64
5、变量的引用,单引号,双引号
********************************
[root@localhost tmp]# a=hello && echo $a
hello
[root@localhost tmp]# b=$a && echo $b
hello
[root@localhost tmp]# b=$a123 && echo $b
[root@localhost tmp]# b=$a"123" && echo $b
hello123
[root@localhost tmp]# b=$a 123 && echo $b
-bash: 123: command not found
[root@localhost tmp]# b="$a 123" && echo $b 双引号引用$a的值
hello 123
[root@localhost tmp]# b='$a 123' && echo $b 单引号直接显示$a
$a 123
[root@localhost tmp]# a=3;b=4;echo "$a+$b"=$[$a+$b]
3+4=7
[root@localhost tmp]# let c=$a+$b ; echo $c
7
[root@localhost tmp]# c=$[$a + $b];echo $c
7
三、系统和个人环境变量的配置文件
/etc/profile PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umask等
/etc/bashrc $PS1 umask 以后如果设置umask修改 /etc/profile 不要改这个文件
.bash_profile 用户自己的环境变量, 改文件会调用.bashrc文件
.bashrc 当用户登录时以及每次打开新的shell时, 执行该文件
.bash_history 记录命令历史用的
.bash_logout :当退出shell时,会执行该文件。
***********************************************************
1、设置PS1
[root@localhost tmp]# echo $PS1 // 设置PS1
[\u@\h \W]\$
[root@localhost tmp]# PS1='[\[\e[32m\]#\##\[\e[31m\]\u@\[\e[36m\]\h \w]\$\[\e[m\]'
[#45#root@localhost /tmp]#ls
111.txt 222.txt a4_F-14:01:47.log a6_F-14:01:47.log b2015-04-09-14:10:25.log b.txt
1.txt 2.txt a5_F-14:01:47.log a7_F-14:01:47.log b2015-04-09-14:10:34.log
[#46#root@localhost /tmp]#PS1=[\u@\h \W]\$
-bash: W]$: command not found
[#47#root@localhost /tmp]#PS1='[\u@\h \W]\$'
[root@localhost tmp]#PS1='[\u@\h \W]\$ '
2、~/.bash_profile文件
[root@localhost tmp]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then // .profile 调用.bashrc文件
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
3、~/.bashrc文件解析
[root@localhost tmp]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias vi=vim
# Source global definitions
if [ -f /etc/bashrc ]; then // ~/.bashrc 调用/etc/bashrc 文件
. /etc/bashrc
fi
[root@localhost tmp]#
四、shell中的特殊字符
* 匹配零个或多个字符
?匹配一个字符
# 注释
\ 退义字符。特殊字符还原为普通字符
| 管道 。将符号前面命令的结果丢给符号后面的命令,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等
$ 引用变量,如a=1;echo $a 。 但!$ 是指上条命令的最后参数
; 分号,将多行命令在一行写入时,可用分号
& 让命令后台执行。sleep 500 &
五、常用命令
1、cut -d -f -c
用法:cut [选项]... [文件]...
从每个文件中输出指定部分到标准输出。
长选项必须使用的参数对于短选项时也是必需使用的。
-b, --bytes=列表 只选中指定的这些字节
-c, --characters=列表 只选中指定的这些字符
-d, --delimiter=分界符 使用指定分界符代替制表符作为区域分界
-f, --fields=LIST select only these fields; also print any line
that contains no delimiter character, unless
the -s option is specified
-n with -b: don't split multibyte characters
--complement 补全选中的字节、字符或域
-s, --only-delimited 不打印没有包含分界符的行
--output-delimiter=字符串 使用指定的字符串作为输出分界符,默认采用输入
的分界符
--help 显示此帮助信息并退出
--version 显示版本信息并退出
仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔
开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。
每种参数格式表示范围如下:
N 从第1 个开始数的第N 个字节、字符或域
N- 从第N 个开始到所在行结束的所有字符、字节或域
N-M 从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
-M 从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域
当没有文件参数,或者文件不存在时,从标准输入读取
***************************
cut -d ':' -f 1 /etc/passwd
cut -d ':' -f 1,3 /etc/passwd
cut -d ':' -f 1-4 /etc/passwc
cut -c 2-5 /etc/passwd
cut -c 1 /etc/passwd
****************************
2、sort
sort -t ':' -k3 -n /etc/passwd
sort -t ':' k3 -n /etc/passwd | cut -d: -f3
cut -d: -f3 /etc/passwd | sort -n
-n 数字大小排序
-r 反向排序
-u 去重复
cut -d ':' -f3 1.txt | sort -nr | uniq -c //uniq -c 显示行号
3、wc -l -m -w
-c 输出字节数统计
-m 输出字符数统计
-l 输出行数统计
-L 显示最长行的长度
-w 显示单词计数
[root@localhost tmp]# cat 2.txt
a ab
aa aabb
[root@localhost tmp]# wc 2.txt
2 4 13 2.txt
[root@localhost tmp]# cat -A 2.txt
a ab$
aa aabb$
[root@localhost tmp]# line=`wc -l /etc/passwd | cut -d ' ' -f2`; echo $line
4、uniq -c 去重复
5、tee 类似于 >
cat 4.txt | tee 1.log 。重定向到文件同时,显示在屏幕上
[root@localhost tmp]# cat 2.txt | tee 222.txt
a ab
aa aabb
[root@localhost tmp]# cat 222.txt
a ab
aa aabb
[root@localhost tmp]#
6、tr 替换 。 没sed强大啦
[root@localhost tmp]# cat 2.txt
a ab
aa aabb
[root@localhost tmp]# cat 2.txt | tr [a-z] [A-Z]
A AB
AA AABB
ls | tr 'a-z' 'A-Z'
ls 1.txt | tr 't' 'T'
7、split
-a 指定后缀长度为N (默认为2)
-b 指定每个输出文件的字节大小
-C 指定每个输出文件里最大行字节大小
-d 使用数字后缀代替字母后缀
-l 指定每个输出文件有多少行
******************************************************************
[root@localhost dir1]# for i in `seq 1 10000`;do cat /etc/passwd >>1.txt;done 复制10000次/etc/passwd 到 1.txt
[root@localhost tmp]# split -b 1M 1.txt -d -a 1 log && ls
111.txt 1.txt 222.txt 2.txt log0 log1 log2 log3 log4 log5 log6 log7
[root@localhost dir1]# ls a* | xargs -i mv {} {}.txt
[root@localhost tmp]# ls log* | xargs -i mv {} {}-`date +%F:%T` && ls
111.txt 222.txt log0-2015-04-09:15:46:03 log2-2015-04-09:15:46:03 log4-2015-04-09:15:46:03 log6-2015-04-09:15:46:03
1.txt 2.txt log1-2015-04-09:15:46:03 log3-2015-04-09:15:46:03 log5-2015-04-09:15:46:03 log7-2015-04-09:15:46:03
[root@localhost tmp]# for i in `ls log*` ;do echo $i;done
log0-2015-04-09:15:46:03
log1-2015-04-09:15:46:03
log2-2015-04-09:15:46:03
log3-2015-04-09:15:46:03
log4-2015-04-09:15:46:03
log5-2015-04-09:15:46:03
log6-2015-04-09:15:46:03
log7-2015-04-09:15:46:03
[root@localhost tmp]# n=0;for i in `ls log*`;do mv $i log$n && let n=$n+1 ;done ;ls // 将log*的文件重命名回去
111.txt 1.txt 222.txt 2.txt log0 log1 log2 log3 log4 log5 log6 log7
***************************************************
5、 输入输出重定向
1、 标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
键盘 | /dev/stdin | 0 | 标准类输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
2、输出 重定向
类型 | 符号 | 作用 |
标准输出重定向 | 命令 > 文件 | 覆盖的方式,将命令结构输出到指定的文件 |
标准输出重定向 | 命令 >> 文件 | 追加的方式,将命令结构输出到指定的文件 |
标准错误输出重定向 | 错误命令2> 文件 | 覆盖的方式,将命令的错误输出到指定的文件 2与>之间不能有空格 |
标准错误输出重定向 | 错误命令2>> | 追加的方式,将命令的错误输出到指定的文件 |
正确输出和错误输出 同时保存 |
命令 > 文件 2>&1 | 覆盖的方式,将正确和错误输出都保存到 同一个文件 |
正确输出和错误输出 同时保存 |
命令 >>文件 2>&1 | 追加的方式,将正确和错误输出都保存到 同一个文件 |
正确输出和错误输出 同时保存 |
命令 &>文件 | 覆盖的方式,将正确和错误输出都保存到 同一个文件 |
正确输出和错误输出 同时保存 |
命令 &>>文件 | 追加的方式,将正确和错误输出都保存到 同一个文件 |
正确输出和错误输出 同时保存 |
命令 >>文件1 2>>文件2 |
把正确的输出追加到文件1中,把错误的 输出追加到文件2中 |
2、xargs
1. 当你尝试用rm 删除太多的文件,你可能得到一个错误信息:/bin/rm Argument list too long. 用xargs 去避免这个问题
find ~ -name ‘*.log’ -print0 | xargs -0 rm -f
本例中xargs将find产生的长串文件列表拆散成多个子串,然后对每个子串调用rm。-print0表示输出以null分隔(-print使用换行);-0表示输入以null分隔。这样要比如下使用find命令效率高的多
***********添加100个用户,8位密码随机*****************
[root@localhost tmp]# for i in `seq 1 100` ;do useradd user$i &>/dev/null && echo `mkpasswd -l 8`| passwd --stdin user$i &>/dev/null;done
***********删除user开头用户 *************************
[root@localhost tmp]# for i in `grep ^user /etc/passwd | cut -d: -f1 `;do userdel -r $i && echo "delete $i success";done