shell学习笔记---抄录

SHELL笔记

1、查看一个文件或目录的大小 ls   du  

2、查看状态     stat 文件名

3、系统本身所有,通常为大写字母

4、系统变量通过 set 或 declare 指令进行查看

5、UDV 变量(user defined variable)
用户创建和维护,建议大写(为什么?)
原因:避免冲突与混淆,因为 Linux 系统中命令全部采用小写的方式

6、Shell 中所有变量定义都为字符串。
变量区分大小写,如:foo 和 Foo 是两个不同的变量
变量必须以字母或下划线开头,不得有”,”,”:”,”\”等特殊字符。

7、1)变量的定义
变量名=值 (变量名与值之间”=”号没有空格)   举例:LANG=cn 与 LAGN= en LANG =en
2) 声明带空格变量
需要加上引号——” ”     举例:MY=23 67
3) 声明一个只读变量    readonly MY_UDV=guozi
4) 修改变量
修改环境变量 例:PATH=$PATH:/opt/bin      修改用户自定义变量 例:SRC=”guozi”

8、变量的使用
变量前加“$”符号
echo $HOME 或 echo ${HOME}   echo $USER 或 echo ${USER}
思考:为什么要使用变量?为什么要添加界定符:{} ?

因为这样,变量名之后可继续接内容

 

9、重定向输出

直接输入:ls –l > lsoutput.txt    追加:ls –l /home >> lsoutput.txt
输出到空设备:/dev/null
“>” 代表重定向到哪里
“1” 表示 stdout 标准输出,系统默认值是 1
">/dev/null"等同于"1>/dev/null"
“2” 表示 stderr 标准错误
“&” 表示等同于的意思,2>&1,表示 2 的输出重定向等同于 1
举例:killall ser > /dev/null 2>&1

10、重定向输入
shell 终端中交互式输入内容
格式:cat >> 2.txt <<EOF [内容] EOF
从一个文件中读取内容赋值给一个变量
格式:read variable < filename

 

11、显示文本或变量值
格式:echo [选项][字符,变量……]
选项:
-n 不换行输出 echo 默认是输出一次换一行
-e 增强。启用转义字符解析
\a 响铃 \b 退格 \c 去除尾部的新行
\n 新的一行 \r 回车 \t 水平制表符
\\ 斜杠 \0NNN 八进制 \0xHH 十六进制输出
举例: echo -e “ Welcome to GuoZi’ s \n\t\\ shell programming”

 

12、输出有颜色的字符
前景色:十位数的 3 表示 范围:30-37(3x 表示)
背景色:十位数的 4 表示 范围:40-47(4x 表示)
个位数表示色彩
30(黑色) 31(红色) 32(绿色) 33(黄色)
34(蓝色) 35(洋红) 36(青色) 37(白色)
举例:echo -e "Network restarting... [\033[32;40m OK \033[0m]"

 

13、计算方法
有三种格式可以进行数学计算。
1.1.第一种——expr
格式:expr 操作数 1 操作符 操作数 2
举例:
1 expr 1 + 2 TMP=$(expr 1 + 2)
2 expr 1 + 4 / 3 TMP=$(expr 1 + 4 / 3 )
3 expr 1 + 2 * 3(?)
特点:格式要求相对严格

1.2.第二种——( )
格式:$((操作数 1 操作符 操作数 2 ))
举例:TMP=$((1 + 3))
特点:格式要求相对较松
1.3.第三种——let
格式:let “[变量] [操作符] 操作数 1 操作符 操作数 2”
举例:
1 let “1+2” 2 let “TMP2=1+2”
特点:格式要求松,计算灵活

 

14、1、什么叫引用
对 shell 脚本、程序、终端命令、变量、字符串等结果的反馈。
2. 引用的类型
" " 双引号 ` 反引号 ' ' 单引号 \ 反斜线
3. 引用的必要性
目的:防止不必要的误会。
举例:
1 echo hello world * 与 echo “hello world *”
2 echo “hello ‘ world “ welcome”
3 echo “hello \ world”

3.1. 双引号
使用双引号可引用除字符 $、`、\ 外的任意字符或字符串。
举例:
1 echo “Welcome to #$%^ to Shell programming”
2 echo “Welcome to $ABC programming”
3.2. 单引号
单引号与双引号类似,不同的是 shell 会忽略任何引用值。
举例:
echo “The ‘$BOY’ is 24 years old”
3.3. 反引号
反引号用于将系统命令的输出到变量,举例:
1 echo `hello` (错×)
2 echo `date` (对√)
3.4. 反斜线
如果下一个字符有特殊含义,反斜线防止 shell 误解其含义
下述字符包含有特殊意义: & * + ^ $ ` " | ?。

 

1. 匹配文件的符号
定义:匹配字符串类型的符号称之为元字符。
1.1. * 匹配文件
* 匹配文件名中的任何字符串,包括空字符串。
举例:ls /etc/*.conf  ls /etc/cg*.co*f
1.2. ? 匹配文件
? 匹配文件名中的任何单个字符。
举例:  ls /etc/pptp?.conf    ls /etc/??st.conf
1.3.[ ] 匹配文件
Ø [...] 匹配 [ ] 中所包含的任何一个字符。
杂乱匹配:ls /etc/[wersdfp]syslog.conf
范围匹配:ls [0-9][a-zA-Z].txt
Ø [!...] 匹配 [ ] 中非感叹号!之后的任意一个字符。
与上一条规则刚好相反。
举例:ls [!0-9]*.txt    匹配非数字开头的后缀名为 txt 的所有文件。

 

2. 1. 命令的执行结果
查看命令执行返回值:echo $?   成功:返回 0    失败:返回非 0
2. 命令执行控制
2.1.使用&&符号
格式:命令 1 && 命令 2 && …
说明:如果命令 1 执行成功,那么执行命令 2……
举例:cp /home/file.txt /opt && echo “Copy file success”
编译源码时:./configure && make && make install
用处:用于脚本的执行的调试。
2.2.使用 || 符号
格式:命令 1 || 命令 2 || …
说明:如果||左边的命令执行失败了,那么接着执行右边的命令
举例:cp hello.txt copy.txt || echo “Copy file failed”
用处:用于脚本的执行的调试。
3. 命令的组合使用
格式 1: “;”一次下达两个以上的命令
格式 2: (命令 1;命令 2;. . .) 在当前 shell 中执行
格式 3:{命令 1;命令 2; . . . } 在子 shell 中执行
举例:
1) ls /usr ; cd ; echo “OK”
2) (ls ; cat hello.txt; cd) || echo “success”
3) {ls ; cat hello.txt; cd}|| echo “success”

 

3. 正则有哪些元字符
[ ] \ ^ $ . | ? * + ( )
3. 基本元字符集及其含义
^ 匹配行首
$ 只匹配行尾
* 一个单字符后紧跟*,匹配 0 个或多个此单字符
[ ] 只匹配[ ] 内字符。可以是一个单字符,也可以是字
符序列。可以使用‘-’表示[ ]内字符序列范围,如
用[ 1 - 5 ]代替[ 1 2 3 4 5 ] \
\ 用来屏蔽一个元字符的特殊含义。因为有时在 shell 中一些元字符有特殊含义。\可以使其失去应有意义。\t \r \n
? 告诉引擎匹配前导字符 0 次或一次
+ 告诉引擎匹配前导字符 1 次或多次
.只匹配任意单字符
p a t t e r n \ { n \ } 只用来匹配前面 p a t t e r n 出现次数。n 为次数
p a t t e r n \ { n,\ } 只含义同上,但次数最少为 n
p a t t e r n \ { n,m \ } 只含义同上,但 p a t t e r n 出现次数在 n 与 m 之间

 

4. 匹配开头和结尾字符    格式:grep { ^string | string $ } filename

5. 示例:  grep ^[a-z]tr filename    grep tr$  filename

6. 匹配整个单词     格式: grep ‘\bword\b’ filename

7. .  ?  +和 *的用处    格式:grep { … | ? | .*}  filename

8. . 匹配单个字符能匹配空格  * 匹配任意字符或字符串的重复多次

9. .+ 字符必须出现1次    .? 字符出现0次或1次

10. 注意:grep不支持+  ?元字符  必须要加上-E选项

11. Perl的正则表达-P

12. .* 的贪婪匹配   .*? 惰性匹配

13. grep的标签

14. 格式:grep ‘\(str\)\(\)\(\)[other]\1’ filename

15. 示例:grep -n '\(tom\)\(guozi\)..\1' a3.txt –color

16. grep中的pattern搜索

17. 格式1:grep ‘[str]\{1\}’ filename

18. 格式2:grep ‘[str]\{1,\}’  filename  格式3:grep ‘[str]\{1,3}’ filename

 

19. sed 命令基本语法
1.1 sed 命令格式   sed [options] {sed-commands} {input-file}
1.2 sed 的 p 命令与-n 选项(print, --quiet --silent)
只打印第一行:   sed -n '1 p' example.txt
打印第一行至第三行    sed -n '1,3 p' example.txt
打印 Jason 所在行    sed -n '/Jason/ p' example.txt
打印 Jason 至 Jane 所在的行    sed -n '/Jason/,/Jane/ p' example.txt
打印以 103 开头的行   sed -n '/^103/ p' example.txt
打印以 Manager 结尾的行   sed -n '/Manager$/ p' example.txt
以数字开头,而且是连续重复三次   sed -n '/^[0-9]\{3\}/ p' example.txt
每隔一行打印一次    sed -n '1~2 p' example.txt
1.3 sed 的 d 命令(delete)
删除 103 字符串所在的行   sed '/103/ d' example.txt
因为 d 命令跟 P 命令的语法是一模一样的, 所以这里不再多举例。
1.4 更多 sed 选项
-f 从文件中读入命令
新建 cmd.sed 命令文件,文件内容如下:  /Jane/ p
在终端输入命令:sed -f cmd.sed example.txt
可在以命令文件中写多个命令
-e 选项执行多个命令
打印 Jason 和 Jane 所在的行  sed -n -e '/Jane/ p' -e '/Jason/ p' example.txt

 

20. 替换命令格式 sed '[address-range|pattern-range] s/originalstring/replacement-string/[substitute-flags]' inputfile
address-range:地址列表,表示从哪个地方开始执行,如:1,3 表示第一行 到第 3 行。
pattern-range:样式列表,表示从哪个样式匹配串开始。如:/Jane/,表示 从行中包含字符串 Jane 的行开始执行。[]中的都是可选的。 s:表示要执行替换命令(substitute)
originalstring:需要被替换的字符串
replacement-string:替换后的字符串。
substitute-flags:可选替换标志符。
2 准备工作 新建一个 example.txt 文本,输入以下内容: 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager

21. 3 address-range 和 pattern-range
a) 把第一行的 John 替换成 guozi 字符串 sed '1 s/John/guozi/' example.txt
b) 把第二行至第五行的 Manager 替换成guozi sed '2,5 s/Manager/guozi/' example.txt
c) 把 John 所以字符串行当中的 CEO 替换成 XXX sed '/John/ s/CEO/XXX/' example.txt
d) 从第四行而且包含字符串 Ram 的行中,把 Developer 字符串替换成 XXX
sed '4,/Ram/ s/Developer/XXX/' example.txt
e) 如果没有 address-range 和 pattern-range,那么就会把每一行碰到的第一 个匹配字符串给替换掉。
sed 's/1/AAA/' example.txt
4 substitute-flags
3.1 全局标志 g(globe)
全局标志会把遇到的所有满足条件的字符串给替换掉
sed 's/1/AAA/g' example.txt
3.2 数字标志 1,2,3
把要匹配串中的第 2 个符合条件的匹配串替换成我们想要的字符串
sed 's/1/AAA/2’ example.txt
3.3 又见 p(print)标志  sed -n 's/1/AAA/p' example.txt
3.4 写标志 w(write) 把每一行碰到第一个字符串 John 替换成 guozi 字符串,并写入 output.txt 中
sed 's/John/guozi/w output.txt' example.txt 对比重定向
重定向会把所以输出到终端的内容全部放到文本当中,而 w 开关只会把
我们所做过修改的行写入文件当中。
3.5 敏感标志 i(ignore flag)
忽略大小写,把文本当中所有包含 jason 字符串的行替换成 AAAA 字符串
sed 's/jason/AAAA/gi' example.txt
3.6 联合使用标志 可以使用多个标志来对字符串进行替换并保存
sed 's/jason/AAAA/gipw output2.txt' example.txt
5 替换命令定界符
格式 1:Sed ‘s///’ example.txt
格式 2:Sed ‘s@@@’ example.txt 用处:使用合理的定界符可以方便的阅读我们的程序代码。
6 强大的&——样式匹配
将 origin-string 替换到 replace-string 当中
sed 's/John/[&]/' example.txt
需求:将开头为三位数字的外面再加一层{}

 

22. 1 直接替换文本内容
有用的-i 选项——强烈要求记住此选项!
2 上一堂课作业讲解
作业:将如下的文本前面三位数截取出来,并加上大括号
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
最终输入效果为:
{101}
{102}
{103}
{104}
{105}
解法一:sed 's/\(^[0-9]*\),.*/{\1}/g' example.txt
解法二:sed 's/\([^,]*\).*/{\1}/' example.txt
3 其它实例详解
a) 截取网卡 IP 地址
解法一:使用 cut 命令
ifconfig eth0 | grep "inet addr" | cut -d: -f 2 | cut -d" " -f 1
解法二:用 grep 命令
课后大家思考一下。
解法三:sed 命令
1) ifconfig eth0 | sed -e '/inet addr/ !d' -e 's/[^0-9]*//' -e
's/ .*//'
2) ifconfig eth0 | sed -e '/inet addr/ !d ; s/[^0-9]*// ;s/ .*//'
3) ifconfig eth0 | sed -e '/inet addr/ !d;
s/\([^0-9]*\)\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\2/'
解法四:awk 命令
暂时不举例。
b) 去除注释和空行
sed 's/^#.*//g' my.cnf  sed -i -e 's/^#.*//g ; /^$/d' my.cnf

 

23. 1. 使用 a 命令追加行
格式:sed '[address] a the-line-to-append' input-file
示例:
1) 在文本的第2行后追加一行
sed '2 a 203,Jack Johnson,Engineer' employee.txt
2) 在文本最后追加一行
sed '$ a 106,Jack Johnson,Engineer' employee.txt
3) 在文本匹配处增加多行
sed '/Jason/a\
203,Jack Johnson,Engineer\
204,Mark Smith,Sales Engineer' employee.txt
2. 使用i命令插入行
格式:sed '[address] i the-line-to-insert' input-file
用法跟a命令类似,不同的是在匹配地址所有行之前
3. 使用c命令修改行
格式:sed '[address] c the-line-to-insert' input-file
意义不同,用法类似
4. 使用l命令打印隐藏字符   格式:sed –n l input-file
5.使用=命令打印行号    格式:sed = input-file
打印字符串所在行号    sed ‘/string/ =’ input-file
6.使用y命令作字符转换
格式: sed ‘y/original-string/replace-string/’ input-file
示例:sed 'y/abcde/ABCDE/' employee.txt
可用于加密字符串
7.使用q命令终止执行
示例:sed ‘5 q’ input-file 执行完第5行后终止
sed ‘/root/ q’ input-file匹配到root行后退出

 

24. 4. awk命令格式
格式1:awk -Fs 'BEGIN{ } /pattern/ {action} END{ }'
input-file
说明:-F指定分隔符
1) 示例:按逗号分割,并打印1,2,3段
awk -F, '{print $1,$2,$3}' employee.txt
2) 示例:awk -F: '/mail/ {print $1}' /etc/passwd
5. Awk内置变量
1) awk分割符FS
awk 'BEGIN { FS=","; \
print "-------------\nName\tTitle\n-------------" } \
{ print $2,"\t",$3; } \
END {print "-------------"}' employee.txt
2) 指定多个分隔域
格式:awk 'BEGIN {FS="[,:%]"} {action} input-file
awk 'BEGIN {FS="[,:%]"} {print $2, $3}' employee.txt
3) 输出分隔符OFS
awk -F ',' '{print $2, ":", $3}' employee.txt
等同于awk -F ',' 'BEGIN { OFS=":" } { print $2, $3 }'
employee.txt
4) 指定分割符并换行RS
指定分割字符,将一行分成多行 输入示例: 103 Raj Reddy Sysadmin - 104 Anand Ram Developer - 105 Jane Miller Sales Manager 输出: John Doe:CEO Jason Smith:IT Manager Raj Reddy:Sysadmin Anand Ram:Developer Jane Miller:Sales Manager
awk 'BEGIN { FS="\n"; RS="-\n"; OFS=":" } \
{print $2, $3}' tmp.txt
5) 输出分割符ORS
awk 'BEGIN { FS=","; OFS="\n";ORS="\n---\n" } {print
$1,$2,$3}' employee.txt

 

1)细谈print与printf
print中变量不需要加引号,字符串需要加引号
示例:date | awk '{print "Month: " $2 "\nYear:",$1}'
2)printf跟C语言基本一致
转义字符
- %c 字符  %s 字符串   %d 十进制整数   %f 浮点型
程序名 状态 版本 用户
COMMAND STATUS VERSION USER
3)OFMT变量控制输出
date | awk '{OFMT="%.2f"; print 1.3456,3.45}'
3. 实例应用
1)将以下字符串以:分隔,分成多行
101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand
Ram:105,Jane Miller
实现:awk 'BEGIN{RS=":"}{print $0}' example1.txt
2)windows与Linux文件格式转换
awk 'BEGIN{RS="\n";ORS="\r\n"}{print $0}' README.txt >README.WIN

 

2)NR 内置变量
记录处理的行号
awk ' /Jason/{ print NR, $0}' test.txt
注意: NR 变量不会重置计数器
4. FILENAME 内置变量
同时处理多个文件时,用来标志当前处理的文件名
注意:
1) 处理文本时显示文件名
2) 从管道输入流接收内容时显示“-”
5. FNR 内置变量
跟 NR 内置变量类似,但会重置计数器。

 

探讨以下三个环境配置文件的执行顺序

1、/etc/profile

以root用户登录的前提下

2、/root/.bashrc(等同于~/.bashrc)

3、/root/bash_profile(等同于~/.bash_profile)

 

实验结果表示,执行顺序依次为:

/etc/profile

~/.bashrc

~/.bash_profile

 

以普通用户登录,发现依然加载了/etc/profile中的环境变量,而没有执行/root目录下的/root/.bashrc和/root/.bash_profile

这个说明/etc/profile是对全局生效,即所有用户都生效。

 

总结一下,环境变量加载配置文件的顺序为:

首先加载全局环境变量配置文件,然后加载私有环境变量配置文件。

 

命令的基本格式
find pathname -options [-print -exec -ok]
pathname 目录路径。
-print 输出到标准输出。
-exec 对匹配的文件执行该参数所给出的 s h e l l 命令,命令的形式为
'command {} \;’注意{ }和\;之间的空格。
-ok 和- e x e c 的作用相同, 只不过以一种更为安全的模式来执行该 参数所给出的 shell 命令,在执行每一个命令之前,都会给出提示,让用户来确 定是否执行。
3 find 其它有用选项
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使 f i n d 命令不在当前指定的目录中查找,如果 同时使用了-depth 选项,那么 - prune 选项将被 find 命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件,类似的还有-ctime -atime
-newer file1 ! file2 查找更改时间比文件 f i l e 1 新但比文件 f i l e 2 旧的文 件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。 d - 目录。  c - 字符设备文件。
p - 管道文件。  l - 符号链接文件。   f - 普通文件。
-size n[c] 查找文件长度为 n 块的文件,带有 c 时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中 查找。
4  find 和 xargs 跟-exec 命令类似,不一样的地方是它是接在管道后面,而且一次性只传送 部分参数,可以避免大参数文件传送时报告参数错误的提示。

 

5 命令的别名

可以使用alias命令来给复杂的变量和参数重新命名,比如:

alias showipt='iptables -nL'

 

alias应用的场合:它可以用在一些命令参数比较多,而且经常使用的地方,进行变量和参数别名的替换。

alias findtxt='find /root/  -type f -name *.txt'

 

使用stty命令加参数[-]echo来进行输出【不】回显

 

cal [-smjy13] [[[day] month] year]

[之间是可选的]  [[[day] month] year] 如果只有一个数字,那么表示年份,如果有两个数字,那么表示月和年,如果有三个,那么表示日,月,年

 

提问:如果我想把时间格式化成:2014-08-21 21:25:00,该怎么做?

使用如下命令达到目的:

date "+%Y-%m-%d %H:%M:%S"

 

提问:如何设置系统时间?

date -s "2014-08-21 21:28:00"

 

提问:如何计算时间戳?

date -d "2014-08-21 21:30:00" +%s

 

提问:为什么要计算时间戳?

为了计算时间差。

 

提问:如何根据时间戳得出日期?

以时间戳1408681800为例

date -d @1408681800 "+%Y-%m-%d %H:%M:%S"

 

locate 和 find

locate 命令是基于 whatis命令数据库而查找的

 

查找home目录下名为flood.c的文件

 

find /home/ -name flood.c

 

find命令是在home目录下递归进行查找,它将会找出所以home目录下符合文件名规则的文件。

 

查找home目录下不区分大小写的,而且文件名flood.c的文件。

 

find /home -iname flood.c

-i : case-insensitive   不敏感

 

基于用户查找:

find /home/sh/ -user guozi

 

基于组查找:

find /home/sh/ -group guest

 

1、查找用户为guozi而且组为guest的文件

find /home/sh -user guozi -group guest

find /home/sh -user guozi [-a] -group guest

 

2、查找用户为guozi,或者组为guest的文件

 

find /home/sh -user guozi -o -group guest

 

3、查找用户为guozi,或者组为guest,而且文件名为guozi.guest.txt的文件

 

find /home/sh -user guozi -o guest -a -name guozi.guest.txt

 

4、查找文件名不为guozi.guozi.txt的文件

 

find /home/sh ! -name guozi.guozi.txt

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值