Linux基础之grep,find

1、定义一个对所有用户都生效的命令别名,例如:lftps='lftp 172.168.0.1/pub'

别名我们经常用到最简单的方法就是
alias: 用法:alias [-p] [名称[=值] ... ]
例如:alias du='du -sh'
但是这样有个缺点只有在当前shell下生效,我们可以将其写在profile文件中永久生效。

[root@node01 ~]# cd /etc/profile.d/
[root@node01 profile.d]# vim alias.sh 
alias  du='du -sh'
保存退出,
[root@node01 profile.d]# source /etc/profile
[root@node01 profile.d]# du /tmp
40M /tmp
[root@node01 profile.d]# alias 
alias cp='cp -i'
alias du='du -sh'

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

解决思路:先找出以/bin/bash结尾的行。
[root@node01 profile.d]# grep "/bin/bash\>$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
gentoo:x:4001:4001::/data/gentoo:/bin/bash
user01:x:4004:4004::/usr/user01:/bin/bash
roobash:x:4005:4005::/home/roobash:/bin/bash
让后加-v 参数取反
[root@node01 profile.d]# grep -v "/bin/bash\>$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
fedora:x:4002:4002:Fedora Core:/home/fedora:/bin/tcsh
mariadb:x:4003:4003::/home/mariadb:/sbin/nologin
[root@node01 profile.d]# 

3、找出/etc/passwd文件中,包含二位数字或者三位数的行。

解决思路:[0-9]表示数字,{2,3}表示出现2-3次,\<,\>首尾锚定
[root@node01 profile.d]# egrep "\<[0-9]{2,3}\>" /etc/passwd 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
或
[root@node01 profile.d]# grep "\<[0-9]\{2,3\}\>" /etc/passwd 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

4、显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式实现。

方法一:[Ss]
[root@node01 tmp]# grep "^[Ss]" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       4063228 kB
SwapFree:        4063228 kB
Shmem:              8684 kB
Slab:              66736 kB
SReclaimable:      35124 kB
SUnreclaim:        31612 kB
方法二:-i 参数区分大小写
[root@node01 tmp]# grep -i "^s" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       4063228 kB
SwapFree:        4063228 kB
Shmem:              8684 kB
Slab:              66736 kB
SReclaimable:      35124 kB
SUnreclaim:        31612 kB
方法三:扩展表达式(S|s)
[root@node01 tmp]# grep  -E  "^(S|s)" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       4063228 kB
SwapFree:        4063228 kB
Shmem:              8684 kB
Slab:              66736 kB
SReclaimable:      35124 kB
SUnreclaim:        31612 kB

5、使用echo输出一个绝对路径,使用egrep取出路径名,类型执行dirname /etc/passwd 的结果。

解决思路:"/"后面一定要有字符。所以我们锚定字符末尾的"/",后面要跟一个或多个字符。
[root@node01 tmp]# echo "/etc/passwd/"  | grep -o ".*\<"
/etc/
[root@node01 tmp]# echo "/etc/passwd"  | grep -o ".*\<"
/etc/
[root@node01 tmp]# dirname /etc/passwd/
/etc
但是我们看到路径名末尾是没有"/"的,所以我们再过滤掉末尾的"/"。
[root@node01 tmp]# echo "/etc/passwd"  | grep -o ".*\<" |grep -o ".*[^/]"
/etc

6、找出ifconfig中的ip地址。要求结果只显示IP地址。

解决思路:我们将IP地址分为4段,前三段都是数字和"."号,最后一段是数字
([0-9]|[1-9][0-9]|[1[0-9][0-9]|2[0-4][0-9]|25[0-5])表示0-255之间的数字
[root@node01 tmp]# ifconfig |egrep  -o "\<(([0-9]|[1-9][0-9]|[1][0-9]{2}|[2][0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|[1][0-9]{2}|[2][0-4][0-9]|25[0-5])\>"
10.192.2.222
255.255.255.0
10.192.2.255
127.0.0.1
255.0.0.0

7、vim定制自动缩进四个字符。

  • 如果是对单个文本文件设置自动缩进四个字符,那么只需要在末行模式下设置
    :set ai
    :set shiftwidth=4
    :set tabstop=4
    :set softtabstop=4
  • 如果是对全局设置,需要修改vim的配置文件,如下:
在修改配置文件之前我们先备份
[root@node01 etc]# cp /etc/vimrc /etc/vimrc.bak
编辑vimrc文件,在文件末尾添加
set ai
set shiftwidth=4
set tabstop=4 
set softtabstop=4

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

解决思路:通过文件读取需要添加的用户名
#!/bin/bash
#自动添加用户
if [ $# -lt 1 ];then
    echo "use like this: sh  useradd.sh  userfile"
    exit 1
fi

declare suid=0

for i in `cat $1`;do

    if grep "^$i\>" /etc/passwd  &>/dev/null ;then
        echo "user $i is exists"
    else
        useradd $i
        echo $i |passwd --stdin $i &> /dev/null
        echo "add user $i finished"
        uid=$(id -u $i)
        suid=$[$suid + $uid]
    fi

done
echo "新增用户ID之和为:$suid"
[root@node01 ~]# vim  name
zhangsan
lisi
wangwu
zhaoliu

[root@node01 ~]# sh useradd.sh name 
add user zhangsan finished
add user lisi finished
add user wangwu finished
add user zhaoliu finished
新增用户ID之和为:16030
[root@node01 ~]# tail -4 /etc/passwd
zhangsan:x:4006:4006::/home/zhangsan:/bin/bash
lisi:x:4007:4007::/home/lisi:/bin/bash
wangwu:x:4008:4008::/home/wangwu:/bin/bash
zhaoliu:x:4009:4009::/home/zhaoliu:/bin/bash

9、find用法以及常用用法的实例演示。

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

  • 查找起始路径:指定具体搜索目标起始路径,默认为当前目录
  • 查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行,默认为找出指定路径下的所有文件
    • 根据文件的从属关系查找
      -user USERNAME 找出属主指定用户的所有文件
      -group RPUNAME 找出属组指定用户的所有文件
      -uid UID 找出属主指定用户UID的所有文件
      -gid GID 找出属组指定用户GID所有文件

    • 根据文件的类型查找
      -type TYPE
      f 普通文件
      d 目录文件
      l 符合链接文件
      b 块设备文件
      c 字符设备文件
      p 管道文件
      s 套接字文件

    • 根据文件大小查找
      -size +。- unit
      常用单位:k,M,G
      根据时间戳查找
      以“天”为单位
      -atime 访问时间
      -mtime 修改时间
      -ctime 改变时间
      以分钟为单位
      -amin
      -mmin
      -cmin

    • 组合测试
      与:-a,默认组合
      或:-o
      非:-not,!
      支持glob风格的通配符 *,?,[],[^]

  • 处理动作:对符合查找条件的文件做出的操作,例如删除等操作,默认为输出至标准输出
    -print 输出至标准输出,默认动作
    -ls 类似于对查找到的文件执行ls -l 命令,输出文件的详细信息
    -delete 删除查找到的文件
    -fls 把查找到的所有文件的长格式信息保存至指定的文件中
    -ok command {} ; 对查找到的每个文件有command表示的命令,每次操作需要用户确认
    -exec comomand {} ; 对查找到的每个文件有command表示的命令,不需要用户确认
    注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令,但是有些命令不能接受过长的参数,为了解决这个问题。用如下命令
    find | xargs command
  • 常用示例:
1、查找/var 目录下属主为root,且属组为mail的所有文件或目录
find /var -user root -a -group mail -ls

2、查找/usr目录下不属于root,bin或hadoop的所有文件或目录,用两种方法
find /usr  !   \( -user root -o -user bin -o -user hadoop \)  -ls
find /usr  !    -user root -a -user bin -a -user hadoop   -ls

3、查找/etc/目录下最近一周内其内容修改过的,且属主不是root用户也不是hadoop用户出的文件或目录
find /etc  -mtime -7 -a ! -user root -a !-user hadoop -ls

4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
 find / -nouser -a -nogroup  -atime -7  -exec ls -l {} \;

5、查找/etc目录下大于1M且类型为普通文件的所有文件
find / -size +1M -type f -exec ls -l {} \;

6、查找/etc目录下所有用户都没有写权限的文件
find /etc ! -perm /222 -type f -exec ls -l {} \;

7、查找/etc目录至少有一类用户没有执行权限的文件
find /etc ! -perm -111 -type f -exec ls -l {} \;

8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件
find /etc  -perm  -113 -type f -exec ls -l {} \;

你可能感兴趣的:(Linux基础之grep,find)