@Great-Chinese
2017-03-03T11:47:55.000000Z
字数 6120
阅读 848
Shell编程入门
A:命令历史
ls ~/.bash_history 查看root用户的命令历史所在路径
echo $HISTSIZE
!! 表示上一条命令
!$ 上一条命令的最后一个参数
!950 运行第950条的命令
!c 从下向上看,命令以C开头的命令
B:Tab键 补全
C: 别名 alias
alias melody='cat a.txt'
unalias melody 取消别名
D:通配符
ls *.txt 显示所有以.txt结束的文件
ls 1* 显示所有以1开头的目录或文件
ls ?.txt 匹配只有一个字符(单个数字,单个字母)
E:管道符 把一个命令的结果丢给另一个命令
cat /etc/passwd |wc -l
F:重定项
echo "melody0113" > a.txt 覆盖原文件(重定项)
echo "melody0113" >> a.txt 追加
wc -l < a.txt 反向重定项(把一个文件的内容丢给另一个命令)
ls 1111 2> a.txt 错误重定项
ls 1111 2>> a.txt 追加错误重定项
G:ctrl z 暂定
jobs 查看暂定的任务
fg 调到前台运行
bg 调到后台运行
A:系统变量
env 查看系统变量
echo $HOSTNAME 查看一个变量的内容
set 显示系统环境变量与自定义变量、额外的变量
a=1; b=2
echo $a $b
B:变量的规则
变量名由字母、下划线、数字组成,但不能以数字开头,避免用系统命令、关键字,大写字母做变量名。
a="ls /tmp",当变量内有特殊字符时需要使用双引号引起来,空格也是特殊字符。
myvim=`which vim`
echo $myvim
/usr/bin/vim
echo $a
ls /tmp
c="$a"12
echo $c
ls /tmp12
d=$myvim$a
echo $d
/usr/bin/vim ls /tmp
export a="ls /tmp" 全局申明
bash 进入bash这个子shell中
echo $a 显示变量
ls /tmp
unset d #将之前定义的变量取消
echo $a #这样就不显示值了
要想让变量无论在shell还是子shell都生效需要将变量加入vim /etc/profile
A:系统相关的配置文件
ls /etc/profile 查看profile文件
vim /etc/profile 进入此文件
vim /etc/profile.d/path.sh 重新定义一个SH文件
source /etc/profile 让修改的/etc/profile生效
echo $PATH
B:bashrc (定义$PS1即前缀,UMASK)
vim /etc/bashrc
echo $PS1
[\u@\h \W]\$
PS1='[\u@\h \w]\$ ' 把W改成w,会显示绝对路径
cd /etc/init.d/
PS1='[\u@\h\t \w]\$ ' 加t显示时间
PS1='[\u@\h-\t \w]\$ ' 加-在时间前面带-
PS1='[\u@\h \W]\$ ' 返回到最初的状态
ls /etc/bashrc 查看bashrc文件
vim /etc/bashrc 进入此文件
vim /etc/profile.d/umask.sh 重新定义一个SH文件
source /etc/profile 让修改的/etc/profile生效
C:查看用户的家目录
ls -la
vim.bash_profile 定义用户自己的环境变量
vim.bashrc 定义用户的别名
?表示一位,文本中
\ 脱意符 ls #1.txt 改变#号原有含义
| 管道符 把前面的命令交给后面的处理
表示上条命令最后一个参数
;常用于两条命令中间,表示两条命令写一起
~ 代表用户家目录
& 把一个命令丢到后台,&& 把2个命令丢一起
*通配符, #注释本行
cut -d: -f 3 /etc/passwd (-d:分隔符, -f第几段)
cut -d: -f 3-5 /etc/passwd (范围值3-5)
cut -c 10 /etc/passwd 显示第10个字符,即截取字符
格式:sort /etc/passwd
-t 分隔符
-k 选择第几段
-n 使用纯数字排序(如果是字母的话,会把它看成0)
-r 反序排序,最小的在下面
-u 排序内容,但不去重复
-un 字母开头的会识别成重复内容,如skj1 a weotj 都会认为是重复内容,只显示数字内容
sort -t: -k3 /etc/passwd 以:为分隔符,按照第3段内容排序
sort -t: -k3,5 /etc/passwd 以:为分隔符,显示3到5段的内容
sort -t: -k3 -n /etc/passwd 以数字排序
sort -t: -k3 -nr /etc/passwd 反序排序
sort -u 2.txt == sort 2.txt |uniq
wc -l 计算一个文档的行数 可适用多个文件,会分别列出并计算总和
wc -w 计算文档的单词个数
wc -m 显示文档包含多少个字符,换行符也算一个符号
A: uniq去重复,还能计出有多少行重复
sort 2.txt |uniq -c 先排序,再去重复
如果只是有uniq -c选项则只会统计出两个连续相同数字,比较笨
B: tee重定向
echo "12345" > 1.txt 不显示信息在当前屏幕
echo "123456" | tee 1.txt 把正确输出信息定向到一个文件中,并且在当前屏幕显示
A:tr 替换字符
ls *.txt 查看所有文件
1.txt 1.txt 2.txt 3.txt
ls *.txt |tr 'a-z' 'A-Z' 把所有文件的小写字母替换成大写字母
echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a' 'A' 编辑一个文档,把文档内所有a字母替换成A字母
echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a-z' 'A-Z'
echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a-f' 'A-F'
B:split 切割大文件
split -b 100 1.txt 以文档大小来切割
split -l 10 1.txt 以文档行数来切割
wc -l anaconda-ks.cfg 查看文档行数
du -sb anaconda-ks.cfg 查看文档大小
split -b 30g anaconda-ks.cfg new_ 指定文件拆分后的文件名前缀
&& 左边命令执行成功后,才会执行右边的命令
|| 左边命令执行不成功,才会执行右边的命令
; 左边命令执行成功与否,后边命令都会执行成功
grep --color -n 'root' /etc/passwd 显示颜色与行数
alias cg='grep --color'
vim .bashrc 如果想永久的使用cg这个别名,就需要编辑此文件
cg -c 'root' 1.txt 显示出现了几行
cg -n 'root' 1.txt 显示行号
cg -v 'root' 1.txt 取反,指显示不包含root的行
cg -n -A 2 'root' 1.txt 显示下面2行
cg -n -B 2 'games' 1.txt 显示下面2行
cg -n -C 2 'games' 1.txt 上面,下面2行都显示
cg -r 'iptables' /etc/* 显示所有目录和文件
cg -rh 'iptables' /etc/* 只显示结果,前面的文件名不显示
cg '[0-9]' 1.txt 显示以数字开头的文件和目录
cg '[a-zA-Z]' 1.txt 显示所有大小写字母
cg -v '[a-zA-Z]' 1.txt 取反
cg '^[a-z]' 1.txt 显示以小写字母开头的文件和目录
cg '^[0-9]' 1.txt 显示以数字开头的文件和目录
cg '[^0-9]' 1.txt 显示非数字开关的文件和目录
cg '^[^0-9]' 1.txt 显示非数字开关的文件和目录,不可以是空行
cg -v '^[0-9]' 1.txt 显示非数字开关的文件和目录,可以是空行
cg '^$' 1.txt 显示空行
cg -v '^$' 1.txt 显示空行之外的行
cg 'r.o' 1.txt .表示任意的字符
cg 'r*o' 1.txt *表示任意多个r都可以匹配,只要与o连在一起
cg 'r.*o' 1.txt 表示任意多个任意字符
cg 'r/?o' 1.txt
cg -E 'r/?o' 1.txt
grep --color 'r\?o' 1.txt ==egrep -- 'r?o' 1.txt
egrep --color 'r+o' 1.txt
egrep --color 'root|nologin' 1.txt 或者
grep --color 'root' 1.txt |grep --color 'nologin' 并且
egrep --color '(rr)+' 1.txt 表示一个整体
grep -E --color '(rr)+' 1.txt
grep -E --color '(rr){1,3}' 1.txt 指定次数
grep -E --color '\(rr)\{1,3\}' 1.txt
. 表示任意一个字符
* 表示0个或多个前面的字符
. 表示任意个任意字符
? 表示0个或1个?前面的字符
+ 表示1个或多个+前面的字符
notes: ? + () {} | 这些符号需要脱意,egrep , -E
grep,sed 只可以使用'.' '*' '.*' 这三个符号,
egrep,awk都可以使用'.' '*' '.*' '+' '?' 这五个符号
awk -F':' 'OFS="," {a[$7]=a[$7]+1};END {for(i in a)print i , a[i]}' 4.txt
#打印第3段内容
awk -F ':' '{print $3}' 1.txt
#打印第3段,第4段内容
awk -F ':' '{print $3,$4}' 1.txt
#增加分隔符:,打印第3段,第4段内容
awk -F ':' 'OFS=":"{print $3,$4}' 1.txt
#匹配user,root行
awk '/user|root/' 1.txt
awk '/r*o/' 1.txt
awk '/r?o/' 1.txt
awk '/r+o/' 1.txt
awk '/r.*o/' 1.txt
#根据段匹配
awk -F ':' '$1~/r*o/' 1.txt
#精准匹配,精准打印
awk -F ':' '$1~/r*o/ {print $3}' 1.txt
#多次匹配,可加分号(两个规则,就会加印2次)
awk -F ':' '$1~/r*o/ {print $1,$3}; $1~/nobody/ {print $1,$3}' 1.txt
#一个规则,就只会打印1次
awk -F ':' '$1~/r*o|nobody/ {print $1,$3}' 1.txt
#显示第一段为nobody的行
awk -F ':' '$1=="nobody"' 1.txt
#显示第一段为nobody的行,或者第7段包含nolog的
awk -F ':' '$1=="nobody" || $7~/nolog/' 1.txt
#第3段大于等于80的行,
awk -F ':' '$3>=80' 1.txt
#第7段不等于/sbin/nologin的行
awk -F ':' '$7!="/sbin/nologin"' 1.txt
#第7段不匹配/nolog/的行
awk -F ':' '$7!~/nolog/' 1.txt
#第3段小于第4段的行
awk -F ':' '$3<$4' 1.txt
#第3段等于第4段的行
awk -F ':' '$3==$4' 1.txt
#打印前10行的值
awk -F ':' 'NR<10' 1.txt
awk -F ':' 'NR>10' 1.txt
awk -F ':' 'NR==10' 1.txt
#只打印第10行中第1段,第5段的值
awk -F ':' 'NR==10 {print $1,$5}' 1.txt
awk -F ':' '{if (NR==10) print $1,$5}' 1.txt
#打印有多少段(7段)
awk -F ':' '{print NF}' 1.txt
#满足有7段的条件,并打印第1段
awk -F ':' '{if (NF==7) print $1}' 1.txt
#打印第1段,第7段
awk -F ':' '{print $NR, $NF}' 1.txt
#赋值,打印整行
awk -F ':' 'OFS=":" {$7=$3+$4; print $0}' 1.txt
#赋值,打印第1段,第3段
awk -F ':' 'OFS=":" {$7=$3+$4; print $1,$3}' 1.txt
#循环,所有的第3段相加,再求和
awk -F ':' '{(sum=sum+$3)};END {print sum}' 1.txt
#只打印第10行的内容
sed -n '10'p 1.txt
#打印所有的行,到第10行时,再多打印一次
sed '10'p 1.txt
#指定范围,打印1-10行
sed -n '1,10'p 1.txt
#指定范围,打印10-未行
sed -n '10,$'p 1.txt
#指定范围,打印含有root的行
sed -n '/root/'p 1.txt
sed -n '/r.o/'p 1.txt
sed -n '/r*o/'p 1.txt
sed -n '/r+o/'p 1.txt
#以下几种表达方式需要脱意
sed -n '/r\?o/'p 1.txt
sed -n '/r\+o/'p 1.txt
#
sed -n '/root\|nologin/'p 1.txt
sed -n -r '/root|nologin/'p 1.txt
#
sed -n '/\(oo\)\+/'p 1.txt
sed -r -n '/(oo)+/'p 1.txt
#打印以非数字开头的
sed -n -r '/[^0-9]/'p 1.txt
#打印以非大小写字母开头的
sed -n -r '/[^a-zA-Z]/'p 1.txt
#显示空行
sed -n -r '/^$/'p 1.txt
# 删除空行
sed '/^$/'d 1.txt
#删除所有带大小写字母的行
sed '/[a-zA-Z]/'d 1.txt
#删除所有带数字的行
sed '/[0-9]/'d 1.txt
#删除1至19行,只是显示在屏幕上,原文件没有真正删除
sed '1,19'd 1.txt
#加 -i,会删除原文件,一般不建议用,会误删
sed -i '1,19'd 1.txt
# 把1,10行dj替换成bj
sed '1,10s/dj/bj/g' 1.txt
# 把整行都替换成1212
sed 's/^.*$/1212/g' 1.txt
# 所有行的末尾都加上1212,并且1212前面有空格
sed 's/^.*$/& 1212/g' 1.txt
# 把所有行中的数字都删除
sed 's/[0-9]//g' 1.txt ??????????????????如果带^,为什么结果不一样
sed 's/[a-z,A-Z]//g' 1.txt
#时间同步命令
ntpdate time.windows.com