第四天内容:
1、linux文件权限
2、bash特性及其用法
3、linux文本处理工具
4、grep及egrep用法
一、linux权限,linux哲学思想一起皆文件。
文件权限(rwx)
目录权限(rwx)
chmod:使用8进制操作三类用户的权限,如:chmod 640 fstab ,chmod 6 file = chmod 006 file
操作指定类别使用者权限(ugoa),如 :chmod u=rw g=rwx o=
操作指定类别使用者指定的权限(+,-) 如:chmod +w file (只对属主),chmod +rx(all)
参照一个文件权限改目标文件权限,如:chmod --reference=/tmp/issue.out fstab (参照 issue.out的权限修改tstab的权限)
修改目录权限时:-R(递归)表示修改此目录下所有子目录权限
练习:复制/etc/skel及其内部的所有文件内容为/home/mageedu,要求此目录及其内部的所有文件对其他用户和组没有任何的访问权限
#cp -r /etc/skep /home/mageedu
#chmod -R go= /home/mageedu
chown:chown [-R][--reference=] user file……
chgrp:chown [-R][--reference=] group file……
umask
文件:666-umask
目录:777-umask
系统管理员默认值 022: 创建文件权限644 目录权限755
普通用户默认值 002: 创建文件权限664 目录权限775
如果想改变umask默认值使长期生效/etc/bashrc
注意:若文件使用666-umask的结果中存在执行权限,则对应的权限会被加1后作用生效的权限
bash特性之快捷键:
carl+a :快速跳到命令行首,
carl+e :跳到命令行尾,
carl+u :删除当前光标至命令行首的内容
carl+k :删除当前光标至命令行尾的内容
carl+l :清屏
carl+z :把命令送至后天运行
二、bash环境
shell直译为外壳,是一种解释器(语法分析--词法分析--语义分析),通过条件判断、循环等方式
过程式编程语言执行方式分三种(顺序执行 选择执行 循环执行)
解释器提供了编程环境
脚本:使用bash提供的控制机制,将期望执行的命令罗列在文在中,此文件叫脚本。bash没有库, 整个程序几乎都要依赖系统命令来实现。
编译型语言: 源程序(文本文件)---预处理--编译--汇编--链接 (编译完成后不再依赖编译器)
静态语言
解释型语言: 源程序(脚本也是文本文件)--解析器去读取并执行(必须依赖解释器)
动态语言
bash的特性之变量:
bash变量的类别:
本地变量:只对当前shell进程有效的变量,对其他shell进程无效(包括当前shell进程的子进程)
所有进程都是从init开始的(pstree查看),包含子进程。
定义本地变量:VAR_NAME=VALUE 变量赋值:向变量的存储空间保存数据
如 name=jarry 用echo $name 查看,变量引用:${变量名},
“”:弱引用,里面的变量会被替换,‘’:强引用,里面的所有字符都是字面量,直接输出
环境变量:对当前shell进程及其子shell有效,对其他shell无效。
定义环境变量:export VAR_NAME=VALUE 导出:export VAR_NAME这样把本地变量转成环境变量
如:export name ,这样把本地变量转成环境变量所有子shell都生效,取消unset name.
将变量改成只读变量: readonly name,这样再给name 赋值就提示无法赋值。
用户可以自定义环境变量,bash有许多内置的环境变量,如PATH.
局部变量:对shell脚本中某代码片段有效;通常用于函数中
定义:local VAR_NAME=VALUE
位置变量:$1,$2,$3……${10}
特殊变量:$?
查看当前shell进程中的所有变量:set
查看当前shell进程中的所有环境变量:export,printenv,env
变量命名:1、不能使用程序中的关键字(保留字);如 if,case,for
2、只能使用数字、字母和下划线,且不能以数字开头
3、要见名知义
变量的应用:如创建100个用户,
定义变量 userName=user100,useradd $userName 这样就创建了 user100,再次重复
userName=user101,useradd $userName 这样就创建了 user101 ……以此类推,创建100个用户,如果将其放置一个文件中让计算机循环执行,这就是脚本。
变量类型(变量值的类型)分字符型和字符型
1、存储机制(字符、数值)2、存储空间
数值型:精确数值:整数; 近似数值:浮点型(单精度浮点、双精度浮点)
字符型:char string
布尔型:true,false
类型转换:显示转换,隐式转换
bash是弱类型语言,一切皆字符。
bash的配置文件:
profile类:为交互式登录的用户提供配置(交互式登陆:通过账号密码、su - user、su -l user)
全局配置文件(/etc/profile、/etc/profile.d/*.sh都是组成部分)
用户配置文件(~/.bash_profile)
功能:1、设定环境变量 2、运行脚本或者命令
bashrc类:为非交互式的用户提供配置(非交互式登陆:su user、图像界面下打开的终端、执行脚本)
全局配置文件(/etc/bashrc)
用户配置文件 (~/.bashrc)
功能:1、设定本地变量 2、定义命令别名
通过编辑配置文件修改的配置生效?
1、退出并重新登陆 2、让bash重读此配置文件(. FILE ; source FILE)
交互登陆的用户:执行顺序
/etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
非交互登陆的用户:
~/.bashrc-->/etc/bashrc-->/etc/profile.d/*.sh
给PATH赋值:export PATH=/usr/local/apache/bin:$PATH
三、linux文本处理工具
文本收索:grep,egrep,fgrep
(Global search REgular expression amd Print out the line.)
根据用户指定的文本模式(搜索条件)对目标文件进行逐行收索,显示能匹配到的行。
命令格式:grep [options]……PATTERN(收索条件)
如:grep ‘root'/etc/passwd ;#userName=root #grep "$userName" /etc/passwd
grep --color=auto 'root' /etc/passwd #高亮显示root
正则表达式:
是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或者通配等功能
元字符:不表示其字面意义,而用于额外功能性描述。
基本正则表达式:grep
扩展正则表达式:egrep = grep -E
fgrep:fast grep,不支持使用正则表达式。
基本正则表达式的元字符:
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[0-9],[[:digit:]] [a-z],[[:lower:]] [A-Z],[[upper]] [[:space]]空白字符 [[:punct:]]标点符号 [[:alpha:]]所有字母 [[alnum:]]所有数字
[^]:取反
次数匹配元字符,用于实现指定其前面的字符所能够出现的次数
*:任意长度,它前面的字符可以出现任意次,如:x*y ,xxy xyy y
\?:0次或1次,它前面的字符是可有可无的 ,如:x\?y, xy y ay
\{m\}:m次,它前面的字符要出现M次 如:x{2\}: xy xxy y xxxxy xyy
\{m,n\}:至少m次,最多n次 如:x\{2,5\}y: xy y xxy
\{m,\}:至少m次
\{0,n}:至多n次
位置锚定:
^:行首锚定,写在模式最左侧
$:行尾锚定,写在模式最右侧
^$:空白行
锚定词---词:指不包含特殊字符的链接字符组成的串叫单词。
\<:词首锚定,出现于单词左侧 \b:词首 词尾都可以。
\>:词尾锚定,出现于单词右侧
分组:\(\) 例如 \(ab\)*
分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用。
引用:例如:\(ab\(x\)y\).*\(mn\)
\#:引用第N个括号所匹配到的内容,而非模式本事
例如:\(ab\?c).*\1
命令选项:
-v :反向选取
-o:仅显示匹配的字串,而非字串所在的行。
-i:忽律字符大小写
-E:支持使用扩展正则表达式
-A -B -C #:分别显示上下文,A 前一行,B 后一行,C 前后一行
练习:
1、显示/proc/meminfo文件中以大写或小写S开头的行;
# grep -i '^s' /proc/meminfo
# grep '^[Ss]' /proc/meminfo
# grep -E '^(S|s)' /proc/meminfo
2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
进一步:仅显示上述结果中其ID号最大的用户;
# grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -
4、找出/etc/passwd文件中的一位数或两位数;
# grep "\<[0-9][0-9]\?\>" /etc/passwd
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又 有至少一个非空白字符的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
7、找出netstat -tan命令执行结果中以'LISTEN'结尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用户bash, testbash, basher, nologin(SHELL为/sbin/nologin),而找出 当前系统上其用户名和默认shell相同的用户;
# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
9、扩展题:新建一个文本文件,假设有如下内容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一个单词是由此前某单词加r构成的行。
\(l..e\).*\1r
扩展正则表达式:
字符匹配:
.
[]
[^]
次数匹配:
*:任意次
?: 0次或1次
+: 至少1次;
{m}: 精确匹配m次
{m,n}: 至少m次,至多n次
{m,}
{0,n}
锚定:
^
$
\<, \b
\>, \b
^$, ^[[:space:]]*$
分组:
()
引用:\1, \2, \3
或者:
a|b: a或者b
con(C|c)at
concat或conCat?
conC或cat
grep -E 'PATTERN' FILE...
egrep 'PATTERN' FILE...
练习:使用扩展的正则表达式
10、显示当前系统上root、fedora或user1用户的默认shell;
# grep -E "^(root|fedora|user1):" /etc/passwd | cut -d: -f7
11、找出/etc/rc.d/init.d/functions文件中某单词后跟一组小括号“()”行;
# grep -o -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions
12、使用echo命令输出一个路径,而后使用grep取出其基名;
echo "/etc/sysconfig/" | grep -o -E "[[:alnum:]]+/?"
# echo "/etc/sysconfig/" | grep -o -E "[^/]+/?$" | cut -d/ -f1
13、找出ifconfig命令结果中的1-255之间的数字;
# ifconfig | grep -o -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
14、挑战题:写一个模式,能匹配合理的ipv4地址;1.0.0.1-239.255.255.255
fgrep 'PATTERN' FILE...
不支持正则表达式
本文出自 “liwenjia'blog” 博客,谢绝转载!