内核在系统引导所时载入内存,内核以外的其他程序(shell 等)都保存在磁盘上,这些程序被内核加载到内存中运行,内核管理系统直至关机。shell是用户与内核之间的一个接口。shell解释命令实现用户与内核交互。(脚本文件)
环境变量:
zlm@ubuntu:~$ PATH=$PATH:/home/zlm
zlm@ubuntu:~$ export PATH这样就加入环境变量了
通配符和正则表达式元字符:
通配符是Linux系统本身就支持的,一般是用来通配文件名,而正则表达式需要某些文本过滤工具支持vi grep sed awk,用来匹配字符串
- 正则表达式元字符:vi grep awk sed
$ /love$ 查找以love结尾的匹配 (行尾定位符)
. /l..e 查找l和e之间两个任意字符的匹配 (匹配单个字符)
* /l.*e 查找l和e之间任意个任意字符的匹配(匹配0个或多个*前的字符)
/l*e 查找e前边有0个或者多个l的匹配
[] /[Ll]ove [a-z] [^a-z] 其中[^]表示不匹配其中的字符
\ (转义字符)
\< /\<love 单词的开始是love (词首定义符)
\> /love\> 单词的末尾是love (词尾定义符)
(注意:^是一行的开始 \<是从每个空格开始)
(注意:$是一行的结束 \>是到每个空格结束)
x\{m\} 字符x出现m次
x\{m,\} 字符x出现至少m次
x\{m,n\}字符x出现m到n次
- shell通配符:shell 命令中
* 匹配0个或多个字符
[] 匹配任意一个字符的出现 [!]表示不匹配其中字符
有个需要注意的问题啦:如果一个文件夹下有隐藏文件.hello.swp
ls -l .*swp 只能这样呀不能这样ls -l *swp这样不搜索隐藏文件?
grep:
zlm@ubuntu:~$ grep -v ‘h.*o’ filename 显示filename中不包含匹配文本的所有行
sed:操作的只是一个拷贝
sed [-ni] ‘[n1[n2]]fuction’
sed参数解释:-n 表示只有经过sed特殊处理的那一行才被列出来,否则所有来自stdin的数据都会列出来
-i 直接修改读取文档的内容而不是由屏幕输出
zlm@ubuntu:~$ sed -i '1,3d' filename (这样会直接对filename文件操作,而不是文件的拷贝了)
fuction a :add新增在新的一行(下一行)出现 cat -n filename | sed '1a hello'
i : inter在新的一行(上一行)出现
d: delete删除
c:change取代cat -n filename | sed '1,3c hello'
s:搭配正则表达式精确取代不想c一样整行取代
sed 's/old/new/g'
awk:sed尝尝用于一整行的处理而awk则是将一整个行分成数个字段来处理,每一行中每个字段从$1 $2..这么编号,而$0代表的是这一整行即这一行所有字段的和
awk '条件类型1 {fuction1} 条件类型2 {fuction2} ..' filename
NF 每一行有多少字段
NR 目前awk处理的第几行
FS 目前的分离字符,如果不设定默认是空格
zlm@ubuntu:~$cat /etc/passwd | awk 'BEGIN{FS=":"} $S3<10 {print $1 ”/t" $3}' 因为先将第一行字段读入$1 $2 ...之后才将FS=":"所以第一行的默认分隔还是空格,加上BEGIN就好了
diff:以行为单位比较两个文件
diff [-bBi] file1 file2 忽略空格、空行、大小写
diff -u file.old file.new > file.patch
patch file.old < file.patch 这就是diff的黄金搭档patch
patch -R file.old < file.patch 还原了