目录
前言
书到用时方恨少;事非经过不知难。
——佚名撰
由于工作需要,最近不得不在ubuntu上工作。linux这个平台虽说用了五六年,但是真是用linux工作略显得吃力,原因主要有两个:
1、linux上可视化工具太少
2、linux上的shell命令不是熟练程度不够
为了能在工作能顺利进行,决定把linux shell 编程再学一遍,做下笔记。
常用命令
1、文件权限
为防止文件被恶意更改,可以在相关的文件和目录设置权限位,
一个文件一经创建,就具有三种访问方式:
1) 读,可以显示该文件的内容。
2) 写,可以编辑或删除它。
3) 执行,如果该文件是一个 shell脚本或程序。
按照所针对的用户,文件的权限可分为三类:
1) 文件属主,创建该文件的用户。
2) 同组用户,拥有该文件的用户组中的任何用户。
3) 其他用户,即不属于拥有该文件的用户组的某一用户。
2、下面是对文件和文件夹权限设置的一些常用命令
2.1 chmod :
格式
(1) chmod [who] operator [permission] filename
who的含义是:
u 文件属主权限。
g 同组用户权限。
o 其他用户权限。
a 所有用户(文件属主、同组用户及其他用户 )。
operator的含义:
+ 增加权限。
- 取消权限。
= 设定权限。
permission的含义:
r 读权限。
w 写权限。
x 执行权限。
s 文件属主和组set-ID。
t 粘性位*。
l 给文件加锁,使其他用户无法访问。
u,g,o 针对文件属主、同组用户及其他用户的操作。
*在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个同组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。
如果在文件列表时看到“ t”,那么这就意味着该脚本或程序在执行时会被放在交换区 (虚存)。不过由于当今的内存价格如此之低,大可不必理会文件的“ t”的使用。
(2) chmod [mode] file
其中mode是一个八进制数。
(3) chmod -R [mode] dir
设置dir目录下的所有文件连同各个子目录下的文件的权限
2.2 chown和chgrp
改变文件和文件夹 所属用户和用户组
chmod -R -h owner file
- R选项意味着对所有子目录下的文件也都进行同样的操作。 - h选项意味着在改变符号链
接文件的属主时不影响该链接所指向的目标文件
2.3 find 和 xargs
find 命令主要是是为了在系统中找一个特定的文件,
2.3.1 一般形式如下: find pathname -options [-print -exec -ok]
pathname find命令所查找的目录路径。例如用 .来表示当前目录,用 /来表示系统根目录,省略代表当前目录。
-print find命令将匹配的文件输出到标准输出。
-exec find命令对匹配的文件执行该参数所给出的 s h e l l命令。相应命令的形式为 ' command' {} \;,注意{}和\;之间的空格。
2.3.2命令选项:
f i n d命令有很多选项或表达式,每一个选项前面跟随一个横杠 -。让我们先来看一下该命令的主要选项,然后再给出一些例子。
-name 按照文件名查找文件。
(1)find ~ -name "*.c" 在$HOME目录查找以.c结尾的文件
(2)find ~ -name "*.c" 在当前目录查找以.c结尾的文件
(3)find . -name "[a-z][a-z][0--9][0--9].txt" 如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是 * . t x t的文件
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使 find命令不在当前指定的目录中查找,如果同时使用了 -depth选项,那么 -prune选项将被find命令忽略。
(1)find /apps -name "/apps/bin" -prune
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在 n天以内,+n表示文件更改时间距现在 n天以前。Find命令还有-atime和-ctime选项,但它们都和 -mtime选项相似,所以我们在这里只介绍 -mtime选项
find -mtime +1 修改时间在一天以外的
-nogroup 查找无有效所属组的文件,即该文件所属的组在 /etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在 /etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件 file1新但比文件 file2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n[c] 查找文件长度为 n块的文件,带有 c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统 mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用 cpio命令,将这些文件备份到磁带设备中。
xargs
find命令把匹配到的文件传递给 x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
使用示例:
find -name "*.c" | xargs grep -s "this" 在当前目录下查找以。c为结尾的文件,并在这些文件中查找this
2.3 字符匹配
* 匹配文件名中的任何字符串,包括空字符串。
? 匹配文件名中的任何单个字符。
[...] 匹配[ ]中所包含的任何字符。
[!...] 匹配[ ]中非感叹号!之后的字符。
示例:
ls -l *.c 当前目录下以.c为结尾的文件
ls -l ??et 在下面的例子中,我们列出文件名以任意两个字符开头,接着是 et
ls log.[0-9]* 列出所有以 l o g .开头、后面跟随一个数字、然后可以是任意字符串的文件名
ls log.[!0-9]* 列出所有以 l o g .开头、后面不跟随一个数字、然后可以是任意字符串的文件名
2.4 输入和输出
2.4.1 read 可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。一般形式:
read V1 V2
read name
echo $name
2.4.2 tee 如果希望在看到输出的同时,也将其存入一个文件
tee files 存入一个文件
tee -a files -a表示追加到文件末尾。
ls -l | tee -a test
2.4.3 > 重定向 >>追加
ls >ls.out ls 命令的所有输出都被重定向到 ls.out文件中
2.5 命令执行顺序
2.5.1 &&
命令1 && 命令2 & &左边的命令(命令 1)返回真 (即返回0,成功被执行)后,& &右边的命令(命令 2)才能够被执行
make && cp bin ~/ 编译成功后把bin文件拷贝到home目录
2.5.2 ||
命令1 || 命令2 如果 | |左边的命令(命令 1)未执行成功,那么就执行 | |右边的命令(命令2)
ls test || ls -l 没有 test文件时 才会执行ls -l
2.6 基本元字符集
^ 只匹配行首
^[the] 对以the开头行
$ 只匹配行尾
ls | grep t$ 列出以t结尾的文件
* 一个单字符后紧跟 *,匹配0个或多个此单字符
[ ] 匹配 [ ]内字符。可以是一个单字符,也可以是字符序列。可以使用 - 表示[]内字符序列范围,如用 [1-5]代替[12345]
\ 用来屏蔽一个元字符的特殊含义。因为有时在 s h e l l中一些元字符有特殊含义。 \可以使其失去应有意义
\*\.pas 正则表达式中匹配以 *.pas结尾的所有文件
? 匹配单个字符
ls te?t 列出
pattern\{n\} 用来匹配前面 pattern出现次数。 n为次数
pattern\{n,\}m 含义同上,但次数最少为 n
pattern\{n,m\} 含义同上,但 pattern出现次数在 n与m之间
2.7 grep
对文本文件进行模式查找。如果找到匹配模式, grep打印包含模式的所有行
基本格式
grep [OPTION]... PATTERN [FILE]...
常用选项
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
2.8 tar 总结
1、排除文件夹
app 下有五个文件夹 AL INC MW PRO UI 排除 PRO UI/ui_lib
ar -zcvf app.tar.gz --exclude PRO --exclude UI/ui_lib app/
2.9 sed awk 总结
1、去掉文件中每行的开头的几个字节
sed -i 's/^...//' file #去掉file中每行开头的前三个字节(3个点)
2.10 curl ftp
curl ftp://192.168.4.32/../../etc/fstab -u root: -o mfstab #获取文件
curl -u root: -T mfstab ftp://192.168.4.32/../../etc/ #传输文件
curl ftp://192.168.4.32/../../etc -u root:
curl ftp://192.168.4.32/../../etc/ -u root:
curl -u root: -T /etc/passwd ftp://192.168.4.32/../../etc/
curl ftp://192.168.4.32/../../etc/ -u root:
curl ftp://192.168.4.32/../../etc/ -u root:xd
2.11 dd
测试读写速度
sync;date;dd of=/dev/zero if=test bs=1M count=1024;sync;date
sync;date;dd if=/dev/zero of=test bs=1M count=1024;sync;date