首页 > Linux操作系统 > Linux操作系统 > shell知识点小结1
循环结构
For do
Done
While do
Done
Until do
Done
打印从5到10
[oracle@ ~]$ cat t1.sh
#!/bin/bash
for i in `seq 5 10`
do
echo $i
done
[oracle@ ~]$ cat t2.sh
#!/bin/bash
for i in {5..10}
do
echo $i
done
[oracle@ ~]$ cat t3.sh
#!/bin/bash
for ((i=5;i<=10;i++))
do
echo $i
done
[oracle@ ~]$ sh t3.sh
5
6
7
8
9
10
Seq命令
seq [OPTION]... LAST --默认从1开始
seq [OPTION]... FIRST LAST
seq [OPTION]... FIRST INCREMENT LAST
-f, --format=FORMAT
use printf style. floating-point FORMAT (default: %g)
-s, --separator=STRING
use STRING to separate numbers (default: \n)
-w, --equal-width
equalize width by padding with leading zeroes
分隔符
[oracle@ ~]$ seq -s ";" 1 5
1;2;3;4;5
[oracle@ ~]$ seq -s '#' 5
1#2#3#4#5
[oracle@ ~]$ seq -s '#' 5 | sed -e 's/[0-9]*//g'
####
填充0对齐
[oracle@ ~]$ seq -w 5 10
05
06
07
08
09
10
[oracle@ ~]$ seq -f %05g 1 5
00001
00002
00003
00004
00005
生成数组
[oracle@ ~]$ b=($(seq 5 5 20))
[oracle@ ~]$ echo $b
5
[oracle@ ~]$ echo ${b[0]}
5
[oracle@ ~]$ echo ${b[@]}
5 10 15 20
[oracle@ ~]$ b=$(seq 5 5 20)
[oracle@ ~]$ echo $b
5 10 15 20
Basename
-- strip directory and suffix from filenames
[oracle@ ~]$ basename /usr/bin/sort
sort
[oracle@ ~]$ basename include/stdio.h .h
stdio
参数展开
${var:-word} --如果var存在且非Null则返回,否则返回word
${var:=word} --如果var不存在则为其赋值word并返回
${var:?message} --如果var不存在或为null,返回message
${var:+word} --如果var存在且非null则返回word,否则返回null
file = ${1:-/dev/tty}
[oracle@ ~]$ a=b
[oracle@ ~]$ echo $a,$b
b,
[oracle@ ~]$ echo ${a:-word}
b
[oracle@ ~]$ echo ${b:-word}
word
[oracle@ ~]$ echo $a,$b
b,
[oracle@ ~]$ echo ${b:=word}
word
[oracle@ ~]$ echo $a,$b
b,word
模式匹配
${var#pattern} 如果pattern匹配变量的开头处,则删除匹配的最短部分
${var%pattern} 如果pattern匹配变量的结尾处,则删除匹配的最短部分
[oracle@ ~]$ e=ttt.tt.abc
[oracle@ ~]$ echo ${e#t}
tt.tt.abc
[oracle@ ~]$ f=abc.ttt.tt
[oracle@ ~]$ echo ${f%t}
abc.ttt.t
参数变量
参数大于9时,以{}括起来;
$# --参数总数,每次shift都会将当前参数移后1位并将$#减1
$*/$@ -- 一次表示所有命令行参数 "hi you"会被当作两个参数对待
"$*" --将所有参数视为一个字符串"$1 $2 "
"$@" -- 将所有参数单独列出"$1" "$2"
$$--多半用于文件尾部,建立唯一性的文件名
$? --退出状态值0表示成功
test命令
可用于比较表达式 if test "$str1" = "$str2" 等同于 if ["$str1" ="$str2"]
还用于判断文件类型
-b 块设备文件 -c 字符设备 -d 目录 -e 文件存在 -f 一般文件
-g 设置setgid位 -u 设置setuid位
-h/-L 符号连接
-n 字符串为非null
-z 字符串为null
字符串比较 要加""并且通常添加一个固定前缀 比如 if [ "X$1" = "X$2" ]
n1 -gt n2
n1 -eq n2
n1 -lt n2
n1 -le n2
n1 -ne n2
Cut
-d 分隔符
-f 输出第N个字段
[oracle@justin ~]$ cut -d: -f 1 /etc/passwd | uniq -c
1 root
1 bin
1 daemon
1 adm
1 lp
1 sync
1 shutdown
1 halt
1 mail
1 news
1 uucp
Sort
-t 分隔符
-K n,m 按照第n个字段的m个字符排序
-n 按数字排序
-r 降序排列
-u只要键值唯一,重复的读第一条;uniq则比较所有字段,都相同才唯一;uniq –c/-d/-u
-f 忽略字母大小写
-m 将已排序的输入文件合并为一个排序后输出
-o 将输出指定到一个文件
Sort –t: -k1,1 /etc/password—以用户名第一个字母排序
grep
^--匹配字首
$--匹配字尾
^$--匹配空行
.--单个字符
+--1个或多个字符
?--0个或1个字符
*--0个或多个字符
[^]—不包含指定字符
[:digit:]
[:alnum:]--匹配数字
[:alpha:]--匹配字符,[[:alpha:]]匹配所有英文字母
[:lower:]
[:upper:]
\{n,m\}--匹配前面字符n-m次
grep -v '^$' --删除空行
行最后3个字符为大写 [[:upper:]]\{3\}$
而[[:upper:]]\{3\,}$则变成了最后N(N>=3)个为大写
^abc|efg$--要么以abc开头,要么以efg结尾的行
^(abc|efg)$--该行要么为abc,要么为efg
社保号 ***-**-****,[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}
Sed
使用()支持向后引用,用数字替代()里的内容;
sed 's;\(/home\)/tolsoty;\1/lt;'--不必重复输入/home
默认sed只替换第一个匹配,末尾可添加数字或g,表示只替换第N个或全部替换;
[oracle@justin ~]$ echo justin read well. justin write well. > tmp.txt
[oracle@justin ~]$ more tmp.txt
justin read well. justin write well.
[oracle@justin ~]$ sed 's/justin/Justin/' < tmp.txt
Justin read well. justin write well.
[oracle@justin ~]$ sed 's/justin/Justin/2' < tmp.txt
justin read well. Justin write well.
[oracle@justin ~]$ sed 's/Justin/justin/g' < tmp.txt
justin read well. justin write well.
sed -n '10,42p' foo.xml --打印10-42行
使用//查找候选字符
sed '/foo/,/bar/ s/baz/quux/g'--查找包含foo和bar的行,然后将baz替换为quux
通过反义字符\指定有别于/的界定符
sed -n '\:tolstoy: s;;Tolstoy;p' /etc/passwd
指定行插入数据
1.在指定行前插入一行
sed '2 ittt' -i a.txt # 在第2行前插入ttt,并且将结果更新到a.txt(如果不想将插入真正更新到文件,去掉后面的-i选项就可以)
2.在指定行后插入一行
sed '2 attt' -i a.txt #在第2行后插入ttt,并且将结果更新到a.txt(如果不想更新原文件,去掉-i)
3.在指定的多行前面插入
sed 'n,m ittt' -i a.txt #看得懂了吧
4.在指定的多行后面插入
sed 'n,m attt' -i a.txt #看得懂了吧
http://blog.csdn.net/zbszhangbosen/article/details/7434191
awk
FILENAME--当前输入文件名
FNR--当前文件的记录数
FS--字段分隔符,默认" ",只有在超过一个字符时,才计算作正则表达式
NF--当前记录字段数,$0为整条记录,$NF为当前记录最后一个字段
NR--job记录数
OFS--输出字段分隔符,默认" "
ORS--输出记录分隔符,默认\n
ARGC--输出参数总数
ARGV--参数向量,即数组,第0个元素为awk本身
过程用{}
指令使用’’
正则表达式使用//
数组为稀疏结构,即x[1]=314 x[1000]=3156而2-999都没有实际存储
delete array/array[index]用于删除整个数组和单个数组元素
输入和输出分隔符分别由-FS和-OFS指定
awk 'begin { FS = ':'; FS = '**' } { print $1, $5} ' /etc/passwd
awk –F: ‘{print “User”, $1, “is really”, $5} ’ /etc/passwd
使用AWK模拟wc
[oracle@ ~]$ more hello
asdf sdf
[oracle@ ~]$ wc hello
1 2 9 hello
[oracle@ ~]$ awk '{C+= length($0) + 1; W+=NF} END{print NR,W,C,FILENAME}' hello --红体部分为循环操作(遍历输入文件),最后执行end
1 2 9 hello
使用awk筛选行
[oracle@ ~]$ awk '(FNR >= 7) && (FNR <= 1000) && /DISKSINFO/ {print FILENAME ":" FNR ":" $0}' md_backup.txt
md_backup.txt:8: 'DISKSINFO' => {
md_backup.txt:345: 'DISKSINFO' => {
[oracle@ ~]$ awk '/diskgroup_set|DISKSINFO/' md_backup.txt
@diskgroup_set = (
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
使用awk过滤重复行
[oracle@ ~]$ cat tmp.info
@diskgroup_set = (
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
'DISKSINFO' => {
[oracle@ ~]$ sort tmp.info | uniq
@diskgroup_set = (
'DISKSINFO' => {
[oracle@ ~]$ sort tmp.info | awk 'Last != $0 {print} {Last = $0}'
@diskgroup_set = (
'DISKSINFO' => {
将段落按第一行首字母排序
首先使用awk,RS=””将记录以空行分割,即每个段落合成一行;gsub为全局替换函数,类似sed的s/r/t/g
[oracle@justin ~]$ cat contact
justin
shanghai
021-44444
emily
beijing
010-444
zoo
nanjiang
020-4444
[oracle@justin ~]$ cat contact | awk -v RS="" '{ gsub("\n","^Z"); print} ' |sort -k1,1 | awk -v RS="\n\n" '{ gsub("^Z","\n"); print } '--第2个gsub没有起作用
emily^Zbeijing^Z010-444
justin^Zshanghai^Z021-44444
zoo^Znanjiang^Z020-4444
[oracle@justin ~]$ cat contact | awk -v RS="" '{ gsub("\n","^Z"); print} ' |sort -k1,1 | awk -v RS="\n\n" '{print}' | sed 's/\^Z/\n/g'
emily
beijing
010-444
justin
shanghai
021-44444
zoo
nanjiang
020-4444
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15480802/viewspace-764096/ ,如需转载,请注明出处,否则将追究法律责任。