命令alias、gerp、find及基础Shell脚本

一、 alias 命令:系统设置命令别名

用法:alias [-p] [name[=value] ... ]    注意‘=’和字符串之间不能包含空格

 

显示当前设置的别名:alias 或 alias –p

 1 [root@localhost ~]# alias
 2 
 3 alias cp='cp -i'
 4 
 5 alias egrep='egrep --color=auto'
 6 
 7 alias fgrep='fgrep --color=auto'
 8 
 9 alias grep='grep --color=auto'
10 
11 alias l.='ls -d .* --color=auto'
12 
13 alias ll='ls -l --color=auto'
14 
15 alias ls='ls --color=auto'
16 
17 alias mv='mv -i'
18 
19 alias rm='rm -i'
20 
21 alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
22 
23 [root@localhost ~]# alias -p
24 
25 alias cp='cp -i'
26 
27 alias egrep='egrep --color=auto'
28 
29 alias fgrep='fgrep --color=auto'
30 
31 alias grep='grep --color=auto'
32 
33 alias l.='ls -d .* --color=auto'
34 
35 alias ll='ls -l --color=auto'
36 
37 alias ls='ls --color=auto'
38 
39 alias mv='mv -i'
40 
41 alias rm='rm -i'
42 
43 alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

 

 

 

若只想显示某个别名代表的含义可输入alias name,比如:

1 [root@localhost ~]# alias ls
2 
3 alias ls='ls --color=auto'

 

 

若想为某个命令设置别名可输入 alias 新命令='原命令 选项/参数',比如:

[root@localhost ~]# alias lftps='lftp 172.168.0.1/pub'

[root@localhost ~]# alias lftps

alias lftps='lftp 172.168.0.1/pub'

 

 

别名永久化:
alias的作用仅在该次登入的操作,即输入一次alias后,这个修改只在当前的Shell生效。如果重新开启一个 Shell,或者重新登录,则这些alias将无法使用。好在linux中提供alias永久化的方法:
<1>.若要每次登入就自动生效别名,则把别名加在/etc/profile或~/.bashrc中。然后# source ~/.bashrc

[root@localhost ~]# cat .bashrc

# .bashrc

 

# User specific aliases and functions

 

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

alias lftps='172.168.0.1/pub'

 

# Source global definitions

if [ -f /etc/bashrc ]; then

      . /etc/bashrc

fi

[root@localhost ~]# source ~/.bashrc

[root@localhost ~]# lftps

-bash: 172.168.0.1/pub: No such file or directory

 


<2>.若要让每一位用户都生效别名,则把别名加在/etc/bashrc最后面,然后# source /etc/bashrc

 

若想取消某个别名可输入unalias name,比如

unalias  lftps

 

 

 

二、文本处理工具grep:

    Linux上文本处理三剑客:

        grep, egrep, fgrep:文本过滤工具(模式:pattern)工具;

            grep:基本正则表达式,-E,-F

            egrep:扩展正则表达式, -G,-F

            fgrep:不支持正则表达式,

        sed:stream editor, 流编辑器;文本编辑工具;

        awk:Linux上的实现为gawk,文本报告生成器(格式化文本);

       

概念:正则表达式(Regual Expression, REGEXP):由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;

分类:正则表达式分两类:

基本正则表达式:BRE     

扩展正则表达式:ERE

元字符:\(hello[[:space:]]\+\)\+

           

grep(Global search REgular expression and Print out the line):.

        作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;    

        模式:由正则表达式的元字符及文本字符所编写出的过滤条件;

       

正则表达式引擎;

        用法1:grep  [OPTIONS]  PATTERN  [FILE...]

实例:

[root@localhost ~]# grep "UID" /etc/fstab

UUID=86f402f4-53d3-44d5-be0f-7b83897744d9 /                       ext4    defaults        1 1

UUID=50ad8124-e08c-4e0f-8788-6529804755f4 /boot                   ext4    defaults        1 2

 

        用法2:grep  [OPTIONS]  [-e PATTERN | -f FILE]  [FILE...]

        参数OPTIONS:

                --color=auto:对匹配到的文本着色后高亮显示;

                -i:ignorecase,忽略字符的大小写;

                -o:仅显示匹配到的字符串本身;

                -v, --invert-match:显示不能被模式匹配到的行;

                -E:支持使用扩展的正则表达式元字符;

                -q, --quiet, --silent:静默模式,即不输出任何信息;

               

                -A #:after, 后#行

                -B #:before,前#行

                -C #:context,前后各#行

               

        基本正则表达式元字符:

                字符匹配:

                   . :匹配任意单个字符;

                   []:匹配指定范围内的任意单个字符;

                   [^]:匹配指定范围外的任意单个字符;

                       [:digit:]:所有数字 [0-9]

[:lower:]:所有小写字母 [a-z]

[:upper:]:所有大写字母 [A-Z]

[:alpha:]:所有字母 [a-zA-Z]

[:alnum:]:所有字母和数字 [0-9a-zA-Z]

[:punct:]:所有标点符号

[:space:]:所有空白字符 空格后tab

 

                      

                匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;

                   *:匹配其前面的字符任意次;0,1,多次;

                   .*:匹配任意长度的任意字符

                   \?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;

                   \+:匹配其前面的字符1次或多次;即其面的字符要出现至少1次;

                   \{m\}:匹配其前面的字符m次;

                   \{m,n\}:匹配其前面的字符至少m次,至多n次;

                       \{0,n\}:至多n次

                       \{m,\}:至少m次

                   

                位置锚定:

                   ^:行首锚定;用于模式的最左侧;

                   $:行尾锚定;用于模式的最右侧;

                   ^PATTERN$:用于PATTERN来匹配整行;

                       ^$:空白行;

                       ^[[:space:]]*$:空行或包含空白字符的行;

 

 

                  

                   单词:非特殊字符组成的连续字符(字符串)都称为单词;

                  

                   \< 或 \b:词首锚定,用于单词模式的左侧;

                   \> 或 \b:词尾锚定,用于单词模式的右侧;

                   \<PATTERN\>:匹配完整单词;

               

分组及引用

                   \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;

                       \(xy\)*ab

                      

                   Note:分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:

                       \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

                       \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

                       \3

                  

后向引用:引用前面的分组括号中的模式所匹配到的字符;

 

           

    egrep:

       

        支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E

       

        egrep [OPTIONS] PATTERN [FILE...]

            选项:

                -i, -o, -v, -q, -A, -B, -C

                -G:支持基本正则表达式

                 

            扩展正则表达式的元字符:

                字符匹配:

                   .:任意单个字符

                   []:指定范围内的任意单个字符

                   [^]:指定范围外的任意单个字符

                      

                次数匹配:

                   *:任意次,0,1或多次;

                   ?:0次或1次,其前的字符是可有可无的;

                   +:其前字符至少1次;

                   {m}:其前的字符m次;

                   {m,n}:至少m次,至多n次;

                       {0,n}

                       {m,}

                位置锚定

                   ^:行首锚定;

                   $:行尾锚定;

                   \<, \b:词首锚定;

                   \>, \b:词尾锚定;

                分组及引用:

                   ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;

                   后向引用:\1, \2, ...

                或:

                   a|b:a或者b;

                       C|cat:C或cat

                       (c|C)at:cat或Cat

                      

       

    fgrep:不支持正则表达式元字符;

        当无需要用到元字符去编写模式时,使用fgrep必能更好;

       

作业题;

显示/etc/passwd文件中不以/bin/bash结尾的行;

 [root@localhost ~]# grep -v "/bin/bash$" /etc/passwd

               

找出/etc/passwd文件中的两位数或三位数;

[root@localhost ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd      

                  

找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式;

[root@localhost ~]# grep -i "^s" /proc/meminfo

[root@localhost ~]# grep "^[sS]" /proc/meminfo

[root@localhost ~]# grep -E "^(s|S)" /proc/meminfo

                                  

使用echo命令输出一绝对路径,使用egrep取出其路径名,类似执行dirname /etc/passwd的结果

[root@localhost ~]# echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"                                   

                               

找出ifconfig中的IP地址,要求结果只显示IP地址

[root@localhost ~]# ifconfig |egrep -o "(([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"

 

Vim定制自动缩进四个字符

步骤:1、打开/etc/vimrc文件

2.在末尾加入 set ts=4

 

三、编写shell脚本,实现自动添加三个用户,并计算这三个用户的uid之和

[root@localhost ~]# vim userAdd.sh

 

#!/biin/bash

#date      2018/12/2

#author    gongxu

#miaoshu   添加三个用户,并计算这三个用户的uid之和

 

if [ $# -lt 3 ];then

   echo "at less input three username"

   exit 5

fi

 

if grep "^$1\>" /etc/passwd &> /dev/null;then

   echo "$1 exist"

exit 1

else

   useradd $1

   echo $1 | passwd --stdin $1 &> /dev/null

   echo "$1 add finished"

fi

 

 

if grep "^$2\>" /etc/passwd &> /dev/null;then

   echo "$2 exist"

exit 2

else

   useradd $2

   echo $2 | passwd --stdin $2 &> /dev/null

   echo "$2 add finished"

fi

 

if grep "^$3\>" /etc/passwd &> /dev/null;then

   echo "$3 exist"  

exit 3

else

   useradd $3

   echo $3 | passwd --stdin $3 &> /dev/null

   echo "$3 add finished"

fi

 

id1=$(grep "^$1" /etc/passwd | cut -d : -f 3)

id2=$(grep "^$2" /etc/passwd | cut -d : -f 3)

id3=$(grep "^$3" /etc/passwd | cut -d : -f 3)

id4=$[id1+id2+id3]

echo "user: $1,$2,$3 uid sum=$id4"

 

 

四、find用法及其常用的实例演示

find命令作用:实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找;

find命令的工作特性:

            查找速度略慢;

            精确查找;

            实时查找;

用法:find [OPTIONS]  [查找起始路径]  [查找条件]  [处理动作]

查找起始路径:指定具体搜索目标起始路径;默认为当前目录;

查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;

处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;

        查找条件:表达式:选项和测试

测试:结果通常为布尔型("true", "false")

                  

根据文件名查找:

                       -name  "pattern"

                       -iname "pattern"

                           支持glob风格的通配符;

                               *, ?, [], [^]

                              

                       -regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非其名;

                      

                   根据文件从属关系查找:

                       -user USERNAME:查找属主指定用户的所有文件;

                       -group GRPNAME:查找属组指定组的所有文件;

                      

                       -uid UID:查找属主指定的UID的所有文件;

                       -gid GID:查找属组指定的GID的所有文件;

                      

                       -nouser:查找没有属主的文件;

                       -nogroup:查找没有属组的文件;

                      

                   根据文件的类型查找:

例:find /etc -size +1M -type f –ls    #-type 后表示文件类型的不需要在加 -,只有是find的参数才加 -

                       -type TYPE:

                           f: 普通文件

                           d: 目录文件

                           l:符号链接文件

                           b:块设备 文件

                           c:字符设备文件

                           p:管道文件

                           s:套接字文件

                          

                   组合测试:

                       与:-a, 默认组合逻辑;

                       或:-o

                       非:-not, !

                      

实例:

1、 找出/tmp目录下属主为非root的所有文件;

[root@localhost ~]# find /tmp -not -user root -ls

2、 找出/tmp目录下文件名中不包含fstab字符串的文件;

[root@localhost ~]# find /tmp -not -name "*fstab*" -ls

 3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;                      

[root@localhost ~]# find /tmp -not -user root -a -not -iname "*fstab*" -ls

或保留一个 -not,使用括号:

[root@localhost ~]# find /tmp -not \( -user root -o -not -iname "*fstab*" \) –ls

                   根据文件的大小查找:

                       -size [+|-]#UNIT

                           Unit的常用单位:k, M, G

                          

                           #UNIT:(#-1, #]

                           -#UNIT:[0,#-1]

                           +#UNIT:(#, oo)

                          

                   根据时间戳查找:

                       以“天”为单位:

                           -atime  [+|-]#

                               #:[#, #-1)

                               -#:(#, 0]

                               +#:(oo, #-1]

                           -mtime

                           -ctime

                          

                       以“分钟”为单位:

                           -amin

                           -mmin

                           -cmin

                          

                   根据权限查找:

                       -perm  [/|-]mode

                           mode:精确权限匹配;  例:find /tmp –perm 664

                           /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;

                               9位权限之间存在“或”关系;  例:find /tmp –perm /222 –ls

                           -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;

                               9位权限之间存在“与”关系;

                              

            处理动作:

                -print:输出至标准输出;默认的动作;

                -ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;

                -delete:删除查找到的文件;

                -fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;

                -ok COMMAND {} \;   :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;

                  例:find /tmp –nouser –nogroup –ok chown root:root {} \;  #修改没有用户和用户组的文件,然后加上root用户。

                      注意:{}为查找到的文件名的集合,\; 为固定格式

                -exec COMMAND {} \;  :对查找到的每个文件执行由COMMAND表示的命令;

                   例:find /tmp –perm /002 –exec mv {} {}.danger \;    #修改其他用户有写权限的文件,将其文件名后面加上danger

               

                注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;

                   但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:

                       find | xargs COMMAND

                                  

实例:

 1、查找/var目录下属主为root,且属组为mail的所有文件或目录;     

[root@localhost ~]# find /var -user root -a -group mail –ls                

 

2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;                   

[root@localhost ~]# find /usr -not -user root -a -not -user bin -a -not -user hadoop
[root@localhost ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls

         

3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;       

[root@localhost ~]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
[root@localhost ~]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls                

              

4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录;

[root@localhost ~]# find  /  \( -nouser -o -nogroup \)  -atime  -7  -ls

               

5、查找/etc目录下大于1M且类型为普通文件的所有文件;

[root@localhost ~]# find /etc -size +1M -type f -exec ls -lh {} \;

           

6、查找/etc目录下所有用户都没有写权限的文件;       

[root@localhost ~]# find /etc -not -perm /222 -type f -ls  

 

 7、查找/etc目录至少有一类用户没有执行权限的文件;    

[root@localhost ~]# find /etc -not -perm -111 -type f -ls

                 

8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;         

[root@localhost ~]# find /etc -perm -113 -type f –ls
[root@localhost ~]# find /etc/init.d/ -perm -111 -a -perm /002 -type f -ls 

 

                          

               

 

posted on 2018-12-02 13:17  龙城的天空  阅读(654)  评论(0编辑  收藏  举报

导航