shell学习笔记---抄录
Posted 两头蛇三脚猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ‘[email protected]@@’ 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
以上是关于shell学习笔记---抄录的主要内容,如果未能解决你的问题,请参考以下文章