Shell常用命令

【设置环境变量】
1、使用env命令显示所有的环境变量
$ env
2、使用echo命令查看单个环境变量
$ echo $PATH
3、设置一个新的环境变量
$ export HELLO="Hello!"
语法:export [-fnp][变量名称]=[变量设置值]
参数:
 -f  代表[变量名称]中为函数名称。
 -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
 -p  列出所有的shell赋予程序的环境变量。
注意:export只是临时修改环境变量,退出当前Shell,设置的环境变量失效。

若想永久改变环境变量,直接编辑相关文件,修改后重新载入。
/etc/profile:系统每个用户的环境设置信息,用户第一次登录时执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。
/etc/bashrc:为每一个运行bash shell的用户执行此文件。
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

注意:另外,/etc/bashrc文件作用于所有用户,而~/.bashrc作用于当前用户,继承/etc/bashrc中的变量,他们是\"父子\"关系,如果变量冲突,以~/.bashrc为准。

参考:http://blog.chinaunix.net/uid-25533439-id-3291246.html

【文件安全与权限】
1、使用touch创建文件:$ touch temp;
2、查看目录:ls -[a|l|...]
文件的权限位:
rwx:前三位,文件属主可读、写、执行
rw-:中间三位,组用户可读、写
r--:最后三位,其他用户只可读
文件类型位:
d 目录。
l 符号链接(指向另一个文件)。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。

3、chmod改变文件权限
chmod [who] operator [permission] filename
who:
u 文件属主权限。
g 属组用户权限。
o 其他用户权限。
a 所有用户(文件属主、属组用户及其他用户)。
operator:
+ 增加权限。
- 取消权限。
= 设定权限。
permission:
r 读权限。
w 写权限。
x 执行权限。
s 文件属主和组set-ID。
t 粘性位*。
l 给文件加锁,使其他用户无法访问。
u,g,o 针对文件属主、属组用户及其他用户的操作。

注:设置权限使用绝对模式
chmod [mode] file
文件属主:r w x:4 + 2 + 1
属组用户:r w x:4 + 2 + 1
其他用户:r w x:4 + 2 + 1
示例:chmod 744 test :rwx r-- r- - 赋予文件属主读、写和执行的权限,所有其他用户读的权限。

注意:目录权限代表含义与文件不同
r :可以列出该目录中的文件
w:可以在该目录中创建或删除文件
x:可以搜索或进入该目录

4、使用chown修改属主
chmod -R -h owner file
- R 选项意味着对所有子目录下的文件也都进行同样的操作。
- h 选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

5、umask
当最初登录到系统中时,umask命令确定了你创建文件的缺省模式。这一命令实际上和chmod命令正好相反。你的系统管理员必须要为你设置一个合理的umask值,以确保你创
建的文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。

【查找】
find
find pathname -options [-print -exec -ok]
命令参数:
pathname: find命令所查找的目录路径,.来表示当前目录,用/来表示系统根目录。
-print: find 命令将匹配的文件输出到标准输出。
-exec: find 命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为‘
command‘ {} \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell
命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

选项:
-name:按照文件名查找文件。
-perm:按照文件权限来查找文件。
-user: 按照文件属主来查找文件。
-mtime -n +n:按照文件的更改时间来查找文件,
             -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
-type 查找某一类型的文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
示例:
在/logs目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec rm {} \;

xargs
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一
起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find
命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。
这就是xargs命令的用处所在,特别是与find命令一起使用。
Find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而
不是全部,不像-exec选项那样。这样它可以先i处理最先获取的一部分文件,然后是下一批,
并如此继续下去。

示例:在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log
文件中
$ find / -name "core" -print | xargs echo "" >/tmp/core.log

【输入输出】
1、echo命令输出转义符以及变量。
示例:
# echo -e "\007your home is $HOME , you are connected on `tty`"
your home is /root , you are connected on /dev/pts/1
注:
\007或\a可以让终端铃响一声
显示出$HOME目录,
并且可以让系统执行tty命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,
不是单引号 )。
\n表示换行、\t表示制表符

2、重定向:重定向符号>和>>
示例:
重定向并覆盖原有文件
$ echo "The log files have all been done"> myfile
追加到一个文件的末尾,不覆盖原有的内容
$ echo "$LOGNAME carried them out at `date`">>myfile

3、cat:显示文件内容,创建文件,还可以用它来显示控制字符。
注意:在文件分页符处不会停下来;会一下显示完整个文件。因此,可以使用more命令或把
cat命令的输出通过管道传递到另外一个具有分页功能的命令中,使用命令less file可实现相
同的功能。
示例:$ cat myfile | more

1)显示名为file的文件:
$ cat file
2)显示file1,file2,file3这三个文件
$ cat file1 file2 file3
3)、创建一个包含上述三个文件的内容,名为bigfile的文件,可以用输出重定向到新文件

$ cat file1 file2 file3 > bigfile
4)如果cat的命令行中没有参数,输入的每一行都立刻被cat命令输出到屏幕上
5)新建文件
$cat >myfile

4、tee:读取标准输入的数据,并将其内容输出成文件。
语 法:tee [-ai][--help][--version][文件…]
说 明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存
成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。
参 数:-a 附加到既有文件的面,而非覆盖它。如果给予tee 指令的文件名称已经存在,
预设会覆盖该文件的内容。加上此参数,数据会新增在该文件内容的最面,而不会删除原先之内
容。
-i 忽略中断信号
--help 在线帮助
--version 显示版本信息

示例:
1)列出文本文件slayers.story 的内容,同时复制3 份副本,文件名称分别为ss-copy1、
ss-copy2、ss-copy3:
$ cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3

2)把列出当前目录,并把结果结到myfile里
$ls -l |tee myfile

5、管道
可以通过管道把一个命令的输出传递给另一个命令作为输入,用竖杠“|”表示。
注:文件文件描述符(系统中实际上有12个文件描述符)
输入文件—标准输入0:它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。
输出文件—标准输出1:它是命令的输出,缺省是屏幕,也可以是文件。
错误输出文件—标准错误2:这是命令错误的输出,缺省是屏幕,同样也可以是文件。
如果没有特别指定文件说明符,命令将使用缺省的文件说明符(终端)。
示例:
常用文件重定向命令
command > file 把把标准输出重定向到file中
command >> file 把把标准输出追加到file中
command 1 > file 把把标准输出重定向到file中
command > file 2>&1 把把标准输出和标准错误一起重定向到file中
command 2 > file 把把标准错误重定向到file中
command 2 >> file 把把标准错误追加到file中
command < file1 >file2 command命令以file1文件作为标准输入,以file2文件作为标准输出
command < filename 把command命令以file文件作为标准输入
command << delimiter 从标准输入中读入,直至遇到delimiter分界符
command <&m 文件描述符m作为标准输入
command >&m 标准输出重定向到文件描述符m中
command <&- 关闭标准输入

【文本过滤工具grep】
Linux有grep, egrep, fgrep

grep:
传统的grep程序, 在没有参数的情况下, 只输出符合RE字符串之句子,常见参数如下:
-v: 逆反模示, 只输出"不含" RE 字符串之句子;
-r: 递归模式, 可同时处理所有层级子目录里的文件;
-q: 静默模式, 不输出任何结果(stderr除外);
-i: 忽略大小写;
-w: 整词比对, 类似 \<word\>;
-n: 同时输出行号;
-c: 只输出符合比对的行数;
-l: 只输出符合比对的文件名称;
-o: 只输出符合RE的字符串;
-E: 切换为egrep;

egrep:
grep的扩充版本, 改良了许多传统grep不能或不便的操作。
fgrep:
不作RE处理, 表达式仅作一般字符串处理。

单引号双引号
在grep命令中输入字符串参数时,最好将其用双引号括起来,在调用模式匹配时,应使用单引号。
例如:“string”,这样做有两个原因
一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串。
在调用变量时,也应该使用双引号,诸如: grep “$MYVAR” 文件名,如果不这样,将没有返回结果。

1、在所有文件中查询单词“abc”
$ grep "abc" *
2、精准匹配
$grep "abc\>" abc.txt
返回只包含abc的行
3、与正则配合,查找空行行数
$ grep -c ‘^$‘ abc.txt

【正则表达式(RE)】
1、使用句点匹配单字符
匹配除“\r\n”之外的任何单个字符。
注意,“.”允许匹配ASCII集中任意字符,或为字母,或为数字。

2、在行首以^匹配字符串或字符序列
^只允许在一行的开始匹配字符或单词
示例:行首第四个字符为a:^ . . . a

3、在行尾以$匹配字符串或字符
$与^正相反,它在行尾匹配字符串或字符, $符号放在匹配单词后。假定要匹配以
单词com结尾的所有行:com$

4、使用*匹配字符串中的单字符或其重复序列
匹配前面的子表达式零次或多次(大于等于0次)。例如,zo*能匹配“z”,“zo”以及“zoo”。*等价于{0,}。
与“*”号类似
“+”号:匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
“?”号:匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。

5、使用\屏蔽一个特殊字符的含义
特殊字符:$.‘"*[]^|\+?

6、使用[]匹配一个范围或集合
使用“-”表示一个字符串范围,表明字符串范围从“ -”左边字符开始,到“-”右边字
符结束。
示例:
1)任意一个数字[0-9];
2)任意小写字母[a-z];
3)匹配任一非字母型字符:[^a-zA-Z];
4)匹配任一非数字型字符:[^0-9];

7、使用\{\}匹配模式结果出现的次数
使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用\{\},此模式有三种
形式,即:
pattern\{n\} 匹配模式出现n次。
pattern\{n,\} 匹配模式出现最少n次。
pattern\{n,m} 匹配模式出现n到m次之间,n,m为0-255中任意整数。
示例:匹配字母A出现两次,并以B结尾:A\{2\}B

重要提示:并不是所有语言都支持所有正则字符,实际使用时需注意。
因为.[]^$所有语言都支持,所以可以进行等价代换:
等价:
  ?,*,+,\d,\w 都是等价字符
  ?等价于匹配长度{0,1}
  *等价于匹配长度{0,}
  +等价于匹配长度{1,}
  \d等价于[0-9]
  \w等价于[A-Za-z_0-9]


参考:http://baike.baidu.com/link?url=2_39Tb0YXCeyDNFSovdMqm6_Jye09jx8CDd4gKLO6X3ji0rJHBCJ9EHQnP34JUD-xL53vctIwlnYGda48rajhq

【AWK与SED】
Awk、sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备这个功用。sed是一种非交互式且面向字符流的编辑器,而awk则是一门模式匹配的编程语言,因为它的主要功能是用于匹配文本并处理,同时它有一些编程语言才有的语法,例如函数、分支循环语句、变量等等,当然比起我们常见的编程语言,Awk相对比较简单。

使用Awk,我们可以做以下事情:
    将文本文件视为由字段和记录组成的文本数据库;
    在操作文本数据库的过程中能够使用变量;
    能够使用数学运算和字符串操作
    能够使用常见的编程结构,例如条件分支与循环;
    能够格式化输出;
    能够自定义函数;
    能够在awk脚本中执行UNIX命令;
    能够处理UNIX命令的输出结果;

Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同;同时它又是面向字符流的,输入的字符流经过Sed的处理后输出。这两个特性使得Sed成为命令行下面非常有用的一个处理工具。
sed的处理流程,简化后是这样的:
    读入新的一行内容到缓存空间;
    从指定的操作指令中取出第一条指令,判断是否匹配pattern;
    如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;
    如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;
    当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;
    当所有行都处理完之后,结束。

参考:
http://blog.csdn.net/a81895898/article/details/8482387
http://blog.csdn.net/a81895898/article/details/8482333

本文出自 “暗夜” 博客,请务必保留此出处http://icyore.blog.51cto.com/8486958/1596280

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。