【Linux】通配符 grep与正则规则表达式 常见命令 (hwclock、passwd、su、who 、w、 uname、 uptime 、last 、free、 dmesg、 ps、 top)

  • Post author:
  • Post category:linux



目录


1、grep 命令常见参数及使用方法


常用选项


基本正则表达式


举例


匹配字数


位置锚定


分组及引用


练习题


扩展正则表达式


2、命令通配符


*的使用


?的使用


[ ]的使用


3、命令语法


hwclock命令


passwd 命令


su命令


who命令


w 命令


uname命令


uptime 命令


last命令


free 命令(常用)


dmesg命令


ps 命令(常用)


top命令


1、grep 命令常见参数及使用方法

grep 命令:按照一定规则的文本搜索工具,


打印匹配的行


模式:由正则表达式以及一些文本字符所编写出来的过滤条件



语法:grep 选项 表达式 文件路径

常用选项

-n 打印行号(grep -n ‘root’ /etc/passwd   在该文件中打印出含有root的行号和内容)
-v 反向过滤被模式匹配到的




-r 目录递归搜索 (在多级目录中对文本进行递归搜索   egrep -r “111” *)

-l

打印模式匹配到的文件(找出内容中含有first单词的文件都有哪些。

[roc@roclinux ~]$ grep -l “first” *.txt )

-w 精确匹配整个单词
-o 仅输出匹配到的内容
-e

指定字符串做为查找文件内容的样式。

并列使用多个 -e参数可以实现或条件

-A num 打印匹配到行之后的num行
-B num 打印匹配到行之前的num行
-C num

打印匹配到行的前后num行

( grep -C 1 “bash” /etc/passwd,输出匹配含有bash行和其上下一行)

-E 代表开启扩展正则表达式(grep -E  和 egrep效果一样)


当把匹配数字的规则写成多个的时候,代表至少匹配多次



基本正则表达式


分组和引用
分组 \(\) 将括号中的内容当作一个整体捆绑起来,在后面 进行整体处理
引用 \1 模式的左侧起,第一个左括号与它匹配的右括号之 间的模式所匹配到的字符
\2 模式的左侧起,第二个左括号与它匹配的右括号之 间的模式所匹配到的字符
\3 模式的左侧起,第三个左括号与它匹配的右括号之 间的模式所匹配到的字符


举例


匹配字数

表示





前的d出现0次或1次



表示


*


前的b出现0次或1次或多次,所以会匹配到 高亮显示内容



表示


+


前的b至少出现1次,所以会ac没有匹配到



因为aaaa中每一个a都出现了1次,所以全部匹配到了。

grep “b\{0,3\}”   b至少出现0次,至多出现3次


位置锚定

用词首词尾锚定将aa看作一个完整的单词,但是文件里没有aa 所以找不到


分组及引用

我们在字符的连续匹配中使用过”abc\{1,3\}”,最后得到的匹配的结果有abc,abcc,即c重复一次两次三次都能匹配到,但是如果需要匹配的是重复的abc这一个整个字符时,我们就需要分组,将abc作为一个整体,示例如下:


# vi love.file

He loves his lover

He likes his lover

SHe loves her liker

She likes her liker

# grep “\(l\(..\)e\).*\1” love.file

(表达式的意思为:将第1个括号包裹起来的的内容在最后引用,中间(.*)出现任何内容都可以) ((l..e)包裹起来,..可以是任意两个字符;)

# grep “\(l\(..\)e\).*\2” love.file

(表达式的意思为:将第2个括号包裹起来的的内容在最后引用,中间(.*)出现任何内容都可以) ((..)包裹起来,..可以是任意两个字符;)



练习题

1、显示/etc/passwd中不以/sbin/nologin结尾的行
# grep -v "/sbin/nologin$" /etc/passwd

2、显示/etc/passwd中的完整数字
# grep -o "\<[0-9]\{1,\}\>" /etc/passwd

3、显示/etc/passwd中的两位数和三位数
# grep -o "\<[0-9]\{2,3\}\>" /etc/passwd
# egrep -w "[0-9]{2,3}" /etc/passwd
# grep -E -w "[0-9]{2,3}" /etc/passwd

4、显示/etc/passwd中以apache开头的行
# grep "^apache" /etc/passwd

5、显示/etc/fstab中的空白行,并显示行号
# grep -n "^$" /etc/fstab
# grep -n "^[[:space:]]*$" /etc/fstab

6、显示/etc/fstab中包含defaults单词的行
# grep -n "\<defaults\>" /etc/fstab

7、通过ip a 命令获取主机IP地址
# ip a |grep "[1-9].[1-9].[1-9].[1-9]" |cut -d/ -f1 |cut -dt -f2
# ip a show ens33 |grep -w inet |cut -d '/' -f1 | tr " " @| cut
-d "@" -f6
(tr " " @ 将空格替换成@)
# ip a show ens33 | grep -w inet |egrep -o '([0-9]{1,3}.){1,3}
[0-9]{1,3}/' | egrep -o '([0-9]{1,3}.){1,3}[0-9]{1,3}'


tr 字符替换删除转换  -d 删除字符



扩展正则表达式



* 匹配其前面的字符任意次


.* 任意长度的任意字符(通配符里不可用)

cat 1 |egrep   “[^[:alpha:]]”(过滤除了所以字母的内容)

cat 1 |egrep   “^[[:alpha:]]”(过滤以字母开头的)

cat 1 |egrep   “^[0-9].*[[:alpha:]]$”(过滤以数字开头字母结尾的字符)

cat 1 |grep  ‘^[[:digit:]]\{1,5\}'(过滤以至少1个至多5个数字开头的)

2、命令通配符




它是完全匹配,不是部分匹配。


*的使用

使用*匹配时,不加字符表示匹配所有目录及文件,隐藏目录和文件不会被匹配;


*a

表示匹配当前目录下以a结尾的所有目录及文件,


*a*

示匹配当前目录下包含a的所有目录及文件,


a*

表示匹配当前目录下以a开头的所有目录及文件;


?的使用

表示匹配任意单个字符

① 以任意单个字符开头a?:

②  以任意单个字符结尾?a:


[ ]的使用

匹配指定范围内的

单个字符


①    [12].txt表示打印出含有1或2的txt文件,就算当前目录下有12.txt也不会打印,如下:

[root@localhost ~]# touch 1.txt 2.txt 3.txt 12.txt

[root@localhost ~]# ls [12].txt

1.txt  2.txt

②   如果没有含有1或2的txt文件则把[12].txt看成一个整体交给ls命令处理,如下:

[root@localhost ~]# ls [54].txt

ls: cannot access [54].txt: No such file or directory

③   顺便提下{  },与[ ]不同的是,{ }里的字符用,隔开且如果匹配到一个另一个匹配不到会报错,如下:

[root@localhost ~]# ls {3,4}.txt

ls: cannot access 4.txt: No such file or directory

3.txt

④   [0-9].txt表示匹配0到9之间的txt文件,如下:

[root@localhost ~]# ls [1-4].txt

1.txt  2.txt  3.txt

⑤   { }用..来连接,如果未匹配到会报错,如下:

[root@localhost ~]# ls {1..4}.txt

ls: cannot access 4.txt: No such file or directory

1.txt  2.txt  3.txt

使用通配符时不需要加双引号单引号




练习题:

1、显示一下/etc目录下以一个数字开头、并且以一个大写字母结尾的文件

# ls /etc/[0-9]*[[:upper:]]

2、显示/etc/目录下以l、n、m、p中的一个字母开头,中间有任意一个数字,并且以非 数字结尾的文件

# ls /etc/[lpmn]*[0-9]*[^[0-9]]

3、显示/etc/目录下以非字母开头,后面跟一个大写字母及任意长度的任意字符的文件

# ls /etc/[^[:alpha:]][[:upper:]]*

4、# 练习1:显示/var目录下所有以1开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录

# ls -d /var/1?[[:lower:]]

5、# 练习2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;

# ls -d /etc/[0-9]*[^0-9]

6、# 练习3:显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或目录

# 1s -d /etc/[^a-z][a-z]*

7、# 练习4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/magedu.com目录;

# cp -r /etc/m*[^0-9] /tmp/magedu.com/

8、# 练习5:复制/usr/share/man目录下,所有以man开头后跟一个数字结尾的文件或目录至/tmp/man/目录下# # cp -r /usr/share/man/man[0-9] /tmp/man/

9、# 练习6:复制/etc目录下,所有以conf结尾,且以m,n,r,开头的文件或目录至/tmp/conf.d/目录下

# cp -r /etc/[mnrp]*.conf /tmp/conf.d/


3、命令语法

hwclock命令

硬件时钟是自己电脑的纯硬件时间,通常是主板时间

系统时钟是自己电脑的操作系统时间,这个时间在安装操作系统的时候就设置过了

hwclock 是查询 linux 硬件时间 ;date 命令是获取系统时间


hwclock 常用修改参数

-w  设置硬件时间:从当前系统时间获取硬件时间

-s    设置系统时间:从硬件时间获取系统时间

passwd 命令

  • passwd 命令用来修改用户的密码 超级用户 root 可以修改任何一个可以登录系统的用户的密码;
  • 默认修改自己的密;
  • 只有root可以修改别人的密码,或者有特殊权限的用户(需要root授权)

–stdin   只有root用户才可以使用这种方法给其它用户修改密码,如下:

echo “123456” |passwd user1 –stdin



常用参数

  • -S USERNAME:查看用户的密码状态
  • -d:删除用户密码
  • -l:锁住用户(


    仅root用户可用



  • -u:解锁



总结


给普通用户user1使用-l命令后,普通用户user2无法切换到user1,会显示身份验证失败,使用-u命令解锁后,普通用户user2就可以切换到user1。

su命令

切换用户

超级用户 root 在切换其他用户时不需要输入密码; 普通用户之间进行切换需要输入对应用户的密码。




常用参数

  • su – user   切换用户的时候,用户变量也会切到环境变量
  • su   user   切换用户的时候,用户变量不会切换,当前的环境变量还是以前用户的变量(切                     完以后可以用 $PATH查看)
  • -l:类似于login(它与su -的执行结果是一样的,都是切换到另一个用户,用户变量与环境变        量都改变了)
  • -c commond USERNAME:变更用户身份后执行commond命令,再变回原来用户 身份

who命令

who [参数] 文件

显示当前是哪些用户正在登录的详细信

参数 功能
-a 显示所有信息,相当于所有参数
-b 显示系统最近启动日期
-l 显示所有可登录的终端信息
-m 仅显示关于当前终端的信息。”who -m”相当于”who am i”
-q 显示当前登录的用户名称和人数
-r 显示当前系统的运行级别
-s

仅显示名称、终端和时间等字段信息,为who从的默认输出

pts 伪终端 tty表示终端设备名称

-u 显示当前每个用户的用户名、登录终端、登录时间、终端活动和进程标识
-T/-w 显示tty终端的状态,”+”表示对任何人可写,”-“表示仅对root用户或所有者可写,”?”表示遇到终端故障



run-level 0-6(运行级别)

  • 0:系统停止状态,系统关机,系统默认运行级别不能是0
  • 1:单用户工作状态,只有root权限,系统维护使用,当root密码遗忘时, 通过此级别修改root密码
  • 2:多用户状态,无网络连接
  • 3:完全多用户状态,命令模式状态,最常用的运行级别
  • 4:保留状态
  • 5:图形模式
  • 6:重启状态

w 命令

显示目前登录系统的用户信息

c0c3c166cd8a4c679fd1c786c801deb9.png

FROM   登录用户来源的主机名

JCPU    附加到tty的所有进程使用时间

PCPU   用户当前进程使用的时间

WHAT   用户当前进程/参数

TTY       终端

uname命令

显示操作系统相关信息的命令

常用参数:

-a 显示系统所有相关信息
-m 显示计算机硬件架构
-n 显示主机名称
-r –kernel-release    显示内核发行版本号
-s –kernel-name     显示内核名称
-v –kernel-version  显示内核版本
-p 显示主机处理器类型
-o 显示操作系统名称

-i

显示硬件平台

uptime 命令

显示系统自运行以来多长时间

[root@localhost ~]# uptime

19:02:04 up  1:54,  3 users,  load average: 0.00, 0.01, 0.05

2a860c3a2f6840e88f5bdf5db93fb6e9.png


每个CPU内核的当前活动的进程数不大于3




w命令和uptime命令都可以显示系统运行信息,而w命令会都出一项功能:显示目前登录终端的用户信息。

last命令

用于显示用户最近登录信息


pts  伪终端

tty   终端设备名称

free 命令(常用)

显示系统内存的使用情况 (默认KB形式),习惯使用 free -m (内存以MB形式显示)或者 free -h(有KB,MB,GB的形式);

41a9902fd2e340b494e397a5c2bb9e57.png

dmesg命令

显示开机信息

ps 命令(常用)

显示系统进程瞬间运行状态;


静态的

选项 功能
-A 显示所有的进程,跟-e的效果相同
-a 显示现行终端机下的所有进程,包括其他用户的进程
-u 显示当前用户的进程状态
-x 通常与 a 这个参数一起使用,可列出较完整信息
-l 较长、较详细的将该PID的信息列出
-j 工作的格式(jobs format)
-f 把进程的所有信息都显示出来
-e 表示显示所有继承

以标准语法格式显示当前系ps -e


ps -ef  全格式化的列表

ps -eF

ps -ely

head -n 3   只读取前三行

41d21da56b2343348a84b3c5f956152c.png


以 BSD 语法格式显示当前系统所有进程

ps ax

ps axu

0a3d63f691894f2eae14a782244b5485.png




ps -l



命令各表头的含义

  • F:代表这个进程的flag,如果是4,则代表使用者为 super user
  • S:代表这个进程的状态stat
  • UID:代表执行者的userId
  • PID:进程的id
  • PPID:父进程的id
  • C:占用CPU资源的百分比
  • PRI:指进程的执行优先级(Priority的简写),其值越小越早被执行
  • NI:代表进程的nice值,其表示进程可被执行的优先级的修正数值
  • ADDR:代表进程的地址,它指出该进程在内存的哪个部分,如果是个正在运行的程序,一般都是”-”
  • SZ:占用的内存大小
  • WCHAN:判断当前进程是否正在运行,若为”-“,则代表正在运行;若该进程处于休眠状态,该值就是它在内核中的地址
  • TTY:该进程是在那个终端机上面运行,若与终端机无关,则显示?,另外,tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
  • TIME:占用CPU的时间
  • CMD:所下达的指令名称

  • UID  用户身份验证

  • PID   进程号
  • PPID 父进程号

9dac79db5c9a4acfb69297cda8999b42.png

top命令

显示 Linux 进程信息,


动态的


进程信息可以用键盘来翻页:

Shift+<

Shift+>


fbef4c67c23d497ebee866bc47ddb38a.png



版权声明:本文为weixin_65690979原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。