shell学习集合

2021/4/25 7:27:19

本文主要是介绍shell学习集合,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

# 写在前面

如何使用这篇文章呢?

根据目录中的标题,使用 ctrl(command) + f 搜索标题,可以直接跳转到对应的内容,这是一篇查询类的博客,不是教程,请当做字典使用。

 

# 目录

函数传参

Shell的for循环语句示例

grep查找命令

find命令zzz

find的介绍2

find介绍3

查看进程命令的ps命令

ps结合grep结合awk

diff命令zzz

top命令

du命令和df命令

awk命令

网络状态监控命令lsof

Linux下ps杠ef和ps_aux的区别

kill命令的理解和正确用法

参考aaa

nc命令

开源的缺点简单罗列

source_bash_profile的解决方案

查看端口占用情况

实时查看日志文件和查看日志后100行

supervise的学习

 

# 函数传参

shell中如何写一个函数呢?

这个问题, 首先说, shell中的函数, 在方法体里, 没有形参, 都是通过默认的特殊值获得的, 比如$1, $2, 参数的数量用.

而传参呢, 也是通过方法名后面跟参数来实现的.

数字是直接量,而"abc",即带引号的是字符串. 没有引号的字符串也是直接量.

 

# grep查找命令

如何查找多个文件中的关键词呢?

相当于跨文件查找, 一般我们在vscode, 或者其他重量级IDE里面都有用到跨文件查找, 但是一个简单的shell命令也可以办到.

这个关键字就是 grep, grep "关键字" -n(显示文件名和行号) file_name(接受正则表达式)

那么接下来, 如何递归的跨文件查找含有某个关键字的行呢? 下面会介绍, 请继续看.

 

grep命令也非常的简单, 它的基本用法是这样的, grep 关键字 文件名(支持正则表达式), 意思是, 去找匹配的文件里的含有关键字的那一行. grep 也支持管道用法, 但是有些不一样, grep作为管道的下游,则必须直接读取内容. 例如 ps -ef | grep python

 

例外是, ls | grep python 那就不行了. 我们的意思是, 根据ls查找到的文件, 去查阅里面还有 "python" 的行,其实 ls 得到的都是文件名, 自然就没有结果了.(如果这个文件夹里没有名字叫 python 的文件夹). 但是如果加上一个 xargs 命令, 就达到我们的目的了, ls | xargs grep python.


 

1.主要参数

 

[options]主要参数:

 

    -c:只输出匹配行的计数。

 

    -i:不区分大小写

 

    -h:查询多文件时不显示文件名。

 

    -l:查询多文件时只输出包含匹配字符的文件名。

 

    -n:显示匹配行及行号。

 

    -s:不显示不存在或无匹配文本的错误信息。

 

    -v:显示不包含匹配文本的所有行。



 

pattern正则表达式主要参数:

 

    \: 忽略正则表达式中特殊字符的原有含义。

 

    ^:匹配正则表达式的开始行。

 

    $: 匹配正则表达式的结束行。

 

    \<:从匹配正则表达 式的行开始。

 

    \>:到匹配正则表达式的行结束。

 

    [ ]:单个字符,如[A]即A符合要求 。

 

    [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。

 

    .:所有的单个字符。

 

    * :有字符,长度可以为0。



 

2.实例 

 

(1)grep 'test' d*  #显示所有以d开头的文件中包含 test的行

 

  

 

(2)grep ‘test’ aa bb cc    #显示在aa,bb,cc文件中包含test的行

 

  

 

(3)grep ‘[a-z]\{5\}’ aa   #显示所有包含每行字符串至少有5个连续小写字符的字符串的行

 

 

(4)grep magic /usr/src  #显示/usr/src目录下的文件(不含子目录)包含magic的行

 

 

(5)grep -r magic /usr/src  #显示/usr/src目录下的文件(包含子目录)包含magic的行

 

(6)grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’)


 

# find命令zzz

find 命令,最常用的用法是 find 目录 -name "关键字", 如果使用正则表达式了,一律加上 双引号。*表示数量不限的通配符

因为find是不限制深度的, 会进入全部的子文件夹逐一搜索, 如果只想搜某一个层级, 使用 -d N 或者 --depth N 参数.

 

一.find命令

 

基本格式:find path expression



 

1.按照文件名查找

 

(1)find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找



 

(2)find /etc -name httpd.conf  #在/etc目录下文件httpd.conf



 

(3)find /etc -name '*srm*'  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件



 

(4)find . -name 'srm*'   #表示当前目录下查找文件名开头是字符串‘srm’的文件





 

2.按照文件特征查找     

 

(1)find / -amin -10   # 查找在系统中最后10分钟访问的文件(access time)

 

(2)find / -atime -2   # 查找在系统中最后48小时访问的文件



 

(3)find / -empty   # 查找在系统中为空的文件或者文件夹

 

    

 

(4)find / -group cat   # 查找在系统中属于 group为cat的文件

 

    

 

(5)find / -mmin -5   # 查找在系统中最后5分钟里修改过的文件(modify time)

 

    

 

(6)find / -mtime -1   #查找在系统中最后24小时里修改过的文件

 

   

 

(7)find / -user fred   #查找在系统中属于fred这个用户的文件

 

    

 

(8)find / -size +10000c  #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)

 

    

 

(9)find / -size -1000k   #查找出小于1000KB的文件

 

3.使用混合查找方式查找文件

 

参数有: !,-and(-a),-or(-o)。

 

(1)find /tmp -size +10000c -and -mtime +2   #在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件

 

(2)find / -user fred -or -user george   #在/目录下查找用户是fred或者george的文件文件


 

(3)find /tmp ! -user panda  #在/tmp目录中查找所有不属于panda用户的文件


 

# xargs命令

xargs命令怎么用呢?

xargs 可以把左边的命令输出值存储起来, 然后转发给下一个命令, 比如

echo "a b c" | xargs mkdir , 创建三个文件夹 a,b,c

比如 find . -name "*.md" | xargs grep "关键字" , 搜索后缀以 md 结尾的文件, 含有特定关键字的文件.

 

xargs 是一个转发工具, 它能把使得传统不接受 stdin 管道输入的工具接受 stdin, 它好比是

 

# 查看进程命令的ps命令

如何查看进程命令呢?

我们说,有经典的 ps -ef, 以 linux 标准格式显示进程情况. 有 ps aux, 以 bsd(unix的一个子分支) 的形式显示进程情况.

ps [选项]

下面对命令选项进行说明:

-e 显示所有进程。

-f 全格式。

-h 不显示标题。

-l 长格式。

-w 宽输出。

a 显示终端上的所有进程,包括其他用户的进程。

r 只显示正在运行的进程。

u  以用户为主的格式来显示程序状况。

x 显示所有程序,不以终端机来区分。

 

ps -ef 显示出的结果:

1.UID 用户ID

2.PID 进程ID

3.PPID 父进程ID

4.C CPU占用率

5.STIME 开始时间

6.TTY 开始此进程的TTY—-终端设备

7.TIME 此进程运行的总时间

8.CMD 命令名




 

# ps结合grep结合awk

查找 tomcat 进程,并且杀掉它

一个结合ps 和 xargs以及grep, awk的命令

ps -ef | grep tomcat | grep -v grep | awk '{print $2}' | xargs kill -9

> grep -v 的命令是排除 grep 命令本身启动的进程


 

# diff命令zzz

diff命令的应用场景, 其实是很少的.

如果你把一个代码改了好几个版本, 那么diff就发挥作用了.

diff -u 比较文件 基准文件

 

我们在平时工作的时候,经常要知道两个文件之间,以及同个文件不同版本之间有何异同点。在 Windows 下,有 beyond compare 这个好用的工具,而在 Linux 下,也有很多很强大的工具,良许之前也写过一篇文章介绍:

 

Linux下9种优秀的代码比对工具推荐

 

这些比对工具其实都是基于 diff 命令,下面就详细介绍一些 diff 命令的用法。

 

diff 命令是一个分析文件信息的命令,可以打印出文件之间的差异。它可以逐行地比较两个文件的内容,也可以递归地比较文件夹的内容。diff 命令的输出内容可以让我们知道要使两个文件相同需要做哪些修改,这对于我们的工作很有帮助。

 

在开始前,我们先用文件编辑器创建两个内容相同的文件。这里我们使用的是 nano 。

 

$ nano diffsample1

输入内容:

 

发布

 

优质的

 

技术文章

 

图片

使用 Ctrl+X 和 Y 保存并退出。

 

创建第二个文件:

 

$ nano diffsample2

输入同样的内容并保存退出。

 

需要注意的是,空格和 Tab 对两个文件是否完全相同会有影响。

 

使用 diff 命令查看两个文件是否有差异:

 

$ diff diffsample1 diffsample2

这时 diff 命令没有输出任何信息,说明这两个文件的内容是完全相同的。

 

现在我们对 diffsample2 做一些修改,将文章改为帖子然后保存并退出

 

图片

再使用 diff 命令:

 

$ diff diffsample1 diffsample2

查看输出的信息:

 

图片

在以上输出信息中,3c3 表示第一个文件的第三行需要被替换为第二个文件的第三行,然后为我们提示出了需要修改的内容: 技术文章 和 技术帖子

 

diff 命令所参考的不是第一个文件,而是第二个文件,它的输出信息有以下几种字符:

 

c : 表示必须做一些修改

 

a : 表示必须添加一些内容

 

d : 表示必须删除一些内容

 

字符前的数字表示第一个文件中的行数,字符后的内容表示第二个文件中的行数。

 

< 表示引用的第一个文件中的内容,而 > 表示引用的第一个文件中的内容

 

现在让我们交换两个文件的顺序再试试:

 

$ diff diffsample2 diffsample1

图片

在交换文件顺序之后 diff 参考的文件变成了 diffsample1,提示我们将 技术帖子 修改为 技术文章 。

 

现在我们将 diffsample1 编辑为以下内容:

 

图片

删除了第二行和第三行,再试试使用 diff 命令

 

$ diff diffsample2 diffsample1

图片

现在我们可以看到,因为我们以 diffsample1 作为参考,为了使两个文件相同,我们需要删除 diffsample2 中的第二行和第三行,然后就会和 diffsample1 中的第一行内容相同。

 

我们再试试交换 diffsample1 和 diffsample2 的顺序:

 

$ diff diffsample1 diffsample2

图片

可以看到,现在 diff 给我们的提示信息变为了在 diffsample1 中的第一行后面添加 diffsample2 中的第二行和第三行内容。

 

现在让我们来测试区分内容的大小写:

 

编辑 diffsample1 的内容为:

 

图片

编辑 diffsample1 的内容为:

 

图片

两个文件中唯一的区别是第三行的大小写,再试试 diff 命令

 

$ diff diffsample1 diffsample2

图片

可以看到 diff 命令找出了大小写的不同,如果我们不想检查大小写,可以使用 -i 选项。

 

$ diff -i diffsample1 diffsample2

这时内容没有区别,diff 没有输出任何信息。

 

我们可以使用 -u 选项以统一的格式输出信息:

 

图片

输出信息中使用 - 和 + 表示哪些内容需要被删除或者添加来使得文件内容相同。

 

之前提到过 diff 命令会检查空格或tab,如果我们想要忽略空格和tab,可以使用 -w 选项。

 

在 diffsample2 的第二行 good 后面输入一些空格和tab,并把之前的大写改回小写。

 

图片

再使用 diff 命令

 

$ diff diffsample1 diffsample2

图片

可以看到找出了不同,再使用 -w 忽略空格和tab,这时便没有任何输出信息了。

 

diff 命令还有许多选项,可以用来忽略某些情况或者更改输出等,我们可以使用 man 命令来获取更多的相关信息。



 

# top命令

 

# du命令和df命令

du命令用于检索有关哪些文件使用目录中磁盘空间的更多详细信息。

 

# awk命令

# 学习一下 awk 命令

 

# 背景

## 第一个场景 ps

经常使用 ps 命令, 我们可能想单独获取一个进程ID, 比如有人会丢给你一个这样的命令:

`ps -ef | grep 进程名称关键字 | awk '{print $2}'`

 

运行就可以了, 原理是什么呢?

 

## 第二个场景 grep 命令

我想根据某一个关键字去查询哪些文档里有这个关键字, 我会写一个语句

find . -name “*.md” | xargs grep "关键字"

 

例如这样的命令:

 

```shell

➜ htmls find . -name "*.md" | xargs grep "cpp"

./cpp-html/make/@makefile写法.htm.md::为什么g++ *.cpp 能直接编译出可执行文件还要makefile呢?

grep: ./cpp-html/make/@make: No such file or directory

grep: 命令零基础教程.html.md: No such file or directory

grep: ./cpp-html/make/@CMake: No such file or directory

grep: Tutorial.htm.md: No such file or directory

```

> 不会xargs和find命令 的请翻我的历史博客, 编号 `1@linux` . 里面有介绍

 

你会发现, 因为有的文件名称里面有空格, 所有导致 grep 命令取错了文件名, 我们需要给文件名左右加上双引号才能保证可靠.

这个时候, 我们就必须要 awk 命令了.

 

# 介绍

 

## 例子1

我们先来看一个例子,来自`参考[1]`.

```shell

➜ htmls awk 'BEGIN { str1 = "你好,"; str2 = "简单教程"; str3 = str1 str2; print str3 }'

你好,简单教程

```

怎么解释呢? BEGIN 表示,从头开始, 忽略管道输入,或者不接受输入的文件名, 所以如果要和其他命令配合,就要把 `BEGIN`去掉

> 普通的awk命令是 `awk 命令 文件名`,表示按行处理. 每行按空格切分, $0表示整行, $1表示第一个切分元素.

 

## 例子2

如果我们要输出一个双引号, 那么就要使用转义符 `\`, 当然, 还要使用外面的双引号把本身的双引号括起来, 表示这个一个字符, 因为 awk 本身就是一个语言解释器, 就类似于 python 一样的东西. awk 一定要使用引号才能输出字符串

 

```shell

➜ htmls echo 11 > a.txt

➜ htmls awk '{print "\""}' a.txt

"

```

 

我们可以看到 awk 命令确实输出了双引号.

 

# 完成我们的目标

在第二个场景中, 我们想使用 grep 命令, 但是使用 grep命令,我想根据某一个关键字去查询哪些文档里有这个关键字, 我会写一个语句

`find . -name “*.md” | xargs grep "关键字" `

 

因为有的文件名称里面有空格, 所有导致 grep 命令取错了文件名, 我们需要给文件名左右加上双引号才能保证可靠.

所以, 我们现在就来改造这个命令.

`find -L . -name "*.md" | awk '{a="\"";print a $0 a}' | xargs grep 关键字`

 

需要说明的是, awk命令的字符拼接, 就是用空格隔开就可以了, 类似于 Python中的`+`, 在这里我们使用 `print a $0 a`.

 

> 补充说明: 如果要获取每行记录的话, awk 不需要和xargs搭配, 例如 `ls | awk ' {print "abc/" $0 }'`表示给每一行加上abc


 

# 参考

[1] AWK 字符串拼接符 - 空格 ( ' ' )

[https://www.twle.cn/c/yufei/awk/awk-basic-string-concatenation-operator.html](https://www.twle.cn/c/yufei/awk/awk-basic-string-concatenation-operator.html)

[2] awk中如何输出单引号

[https://www.cnblogs.com/rootq/articles/1417138.html](https://www.cnblogs.com/rootq/articles/1417138.html)



 

# 网络状态监控命令lsof

lsof -i:8000 查看端口, lsof 的全称是 list open file 的意思, 因为网络端口打开需要生成一个 socket 文件,所以可以通过这个命令可以查看

 

## Linux下ps杠ef和ps_aux的区别

 

**ps -ef 是用标准的格式显示进程的、

 

其中各列的内容意思如下

 

- UID //用户ID、但输出的是用户名

- PID //进程的ID

- PPID //父进程ID

- C //进程占用CPU的百分比

- STIME //进程启动到现在的时间

- TTY //该进程在那个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。

- CMD //命令的名称和参数

 

**ps aux 是用BSD的格式来显示、

 

同ps -ef 不同的有列有

 

- USER //用户名

- %CPU //进程占用的CPU百分比

- %MEM //占用内存的百分比

- VSZ //该进程使用的虚拟內存量(KB)

- RSS //该进程占用的固定內存量(KB)(驻留中页的数量)

- STAT //进程的状态

- START //该进程被触发启动时间

- TIME //该进程实际使用CPU运行的时间

 

# kill命令的理解和正确用法

相信很多程序员对于Linux系统都不陌生,即使自己的日常开发机器不是Linux,那么线上服务器也大部分都是的,所以,掌握常用的Linux命令也是程序员必备的技能。

 

但是,怕就怕很多人对于部分命令只是一知半解,使用不当就能导致线上故障。

 

前段时间,我们的线上应用报警,频繁FGC,需要紧急处理问题,于是有同事去线上重启机器(正常程序应该是先采集堆dump,然后再重启,方便排查是否存在内存泄露等问题)。

 

但是在重启过程中,同事发现正常的重启命令应用无反应,然后尝试使用kill命令"杀"掉Java进程,但是仍然无效。于是他私自决定使用 "kill -9"结束了进程的生命。

 

虽然应用进程被干掉了,但是随之而来带来了很多问题,首先是上游系统突然发生大量报警,对应开发找过来说调用我们的RPC服务无响应,频繁超时。

 

后来,我们又发现系统中存在部分脏数据,有些在同一个事务中需要完整更新的数据,只更新了一半…

 

为什么正常的kill无法"杀掉"进程,而kill -9就可以?为什么kill -9会引发这一连串连锁反应?正常的kill执行时,JVM会如何处理的呢?

 

要搞清楚这些问题,我们要先从kill命令说起。


 

kill 命令

我们都知道,想要在Linux中终止一个进程有两种方式,如果是前台进程可以使用Ctrl+C键进行终止;如果是后台进程,那么需要使用kill命令来终止。(其实Ctrl+C也是kill命令)

 

kill命令的格式是:

 

kill[参数][进程号]

 

如:

 

kill 21121

 

kill -9 21121

其中[参数]是可选的,进程号可以通过jps/ps/pidof/pstree/top等工具获取。

 

kill的命令参数有以下几种:

 

-l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称

 

-a 当处理当前进程时,不限制命令名和进程号的对应关系

 

-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号

 

-s 指定发送信号

 

-u 指定用户

 

通常情况下,我们使用的-l(信号)的时候比较多,如我们前文提到的kill -9中的9就是信号。

 

信号如果没有指定的话,默认会发出终止信号(15)。常用的信号如下:

 

HUP 1 终端断线

INT 2 中断(同 Ctrl + C)

QUIT 3 退出(同 Ctrl + \)

TERM 15 终止

KILL 9 强制终止

CONT 18 继续(与STOP相反, fg/bg命令)

STOP 19 暂停(同 Ctrl + Z)

 

比较常用的就是强制终止信号:9和终止信号:15,另外,中断信号:2其实就是我们前文提到的Ctrl + C结束前台进程。

 

那么,kill -9 和 kill -15到底有什么区别呢?该如何选择呢?


 

kill -9 和 kill -15的区别

kill命令默认的信号就是15,首先来说一下这个默认的kill -15信号。

 

当使用kill -15时,系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该信号后,具体要如何处理是自己可以决定的。

 

这时候,应用程序可以选择:

 

1、立即停止程序

2、释放响应资源后停止程序

3、忽略该信号,继续执行程序

因为kill -15信号只是通知对应的进程要进行"安全、干净的退出",程序接到信号之后,退出前一般会进行一些"准备工作",如资源释放、临时文件清理等等,如果准备工作做完了,再进行程序的终止。

但是,如果在"准备工作"进行过程中,遇到阻塞或者其他问题导致无法成功,那么应用程序可以选择忽略该终止信号。

这也就是为什么我们有的时候使用kill命令是没办法"杀死"应用的原因,因为默认的kill信号是SIGTERM(15),而SIGTERM(15)的信号是可以被阻塞和忽略的。

和kill -15相比,kill -9就相对强硬一点,系统会发出SIGKILL信号,他要求接收到该信号的程序应该立即结束运行,不能被阻塞或者忽略。

所以,相比于kill -15命令,kill -9在执行时,应用程序是没有时间进行"准备工作"的,所以这通常会带来一些副作用,数据丢失或者终端无法恢复到正常状态等。

 

Java是如何处理SIGTERM(15)的

我们都知道,在Linux中,Java应用是作为一个独立进程运行的,Java程序的终止运行是基于JVM的关闭实现的,JVM关闭方式分为3种:

正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(接收到SIGINT(2)、SIGTERM(15)信号等)

强制关闭:通过调用Runtime.halt方法或者是在操作系统中强制kill(接收到SIGKILL(9)信号)

异常关闭:运行中遇到RuntimeException异常等。

JVM进程在接收到kill -15信号通知的时候,是可以做一些清理动作的,比如删除临时文件等。

当然,开发者也是可以自定义做一些额外的事情的,比如让tomcat容器停止,让dubbo服务下线等。

而这种自定义JVM清理动作的方式,是通过JDK中提供的shutdown hook实现的。JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子。

例子如下:

package com.hollis;


 

public class ShutdownHookTest {


 

public static void main(String[] args) {

 

boolean flag = true;

 

Runtime.getRuntime().addShutdownHook(new Thread(() -> {

 

System.out.println("hook execute...");

 

}));


 

while (flag) {

 

// app is runing

 

}


 

System.out.println("main thread execute end...");

 

}

 

}

 

执行命令:

➜ jps

 

6520 ShutdownHookTest

 

6521 Jps

 

➜ kill 6520

 

控制台输出内容:

hook execute...

 

Process finished with exit code 143 (interrupted by signal 15: SIGTERM)

 

可以看到,当我们使用kill(默认kill -15)关闭进程的时候,程序会先执行我注册的shutdownHook,然后再退出,并且会给出一个提示:interrupted by signal 15: SIGTERM

如果我们执行命令kill -9:

➜ kill -9 6520

控制台输出内容:

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

可以看到,当我们使用kill -9 强制关闭进程的时候,程序并没有执行shutdownHook,而是直接退出了,并且会给出一个提示:interrupted by signal 9: SIGKILL

 

总结

kill命令用于终止Linux进程,默认情况下,如果不指定信号,kill 等价于kill -15。

kill -15执行时,系统向对应的程序发送SIGTERM(15)信号,该信号是可以被执行、阻塞和忽略的,所以应用程序接收到信号后,可以做一些准备工作,再进行程序终止。

有的时候,kill -15无法终止程序,因为他可能被忽略,这时候可以使用kill -9,系统会发出SIGKILL(9)信号,该信号不允许忽略和阻塞,所以应用程序会立即终止。

这也会带来很多副作用,如数据丢失等,所以,在非必要时,不要使用kill -9命令,尤其是那些web应用、提供RPC服务、执行定时任务、包含长事务等应用中,因为kill -9 没给spring容器、tomcat服务器、dubbo服务、流程引擎、状态机等足够的时间进行收尾。

 

# 参考aaa

[1] ps -ef 的意思

[https://blog.csdn.net/persever/article/details/78739855](https://blog.csdn.net/persever/article/details/78739855)

 

# nc命令

nc IP PORT

 

# 开源的缺点简单罗列

10.开源的缺点是什么?

回答: 下面提到的开源操作系统的缺点

 

使用困难

相容性问题

责任与保证

隐藏费用

 

# source_bash_profile的解决方案

if [ -f ~/.bash_profile ]; then

source ~/.bash_profile

fi

 

# 查看端口占用情况

lsof -i:端口号 用于查看某一端口的占用情况

 

netstat -tunlp |grep 端口号,用于查看指定的端口号的进程情况

 

说明一下几个参数的含义:

 

-t (tcp) 仅显示tcp相关选项

 

-u (udp)仅显示udp相关选项 -n 拒绝显示别名,能显示数字的全部转化为数字


 

-l 仅列出在Listen(监听)的服务状态

 

-p 显示建立相关链接的程序名

 

# 实时查看日志文件和查看日志后100行

实时查看日志文件 tail -f 日志文件log

 

tail -f Console.log

2、实时查看日志文件 后一百行

 

tail - 100f Console.log

 

3、linux查看日志后100行

 

tail -n 100 Console.log

 

# Shell的for循环语句示例

for 变量 in 列表

do

command1

command2

...

commandN

done

或者

for var in list; do


 

有两种解决办法:

*使用转义字符(反斜线)来将单引号转移;

*使用双引号来定义用到单引号的值。

 

#!/bin/bash

#basic for command

 

for linuxidc in Kotlin Linuxmi\'com linux Ubuntu "CentOS'rhel" Oracle

do

echo The next state is $linuxidc

done

 

执行结果:

 

linuxidc@linuxidc:~/linuxidc.com$ ./linuxidc.sh

The next state is Kotlin

The next state is Linuxmi'com

The next state is linux

The next state is Ubuntu

The next state is CentOS'rhel

The next state is Oracle

 

从命令读取值

 

有两种方式可以将命令输出赋值给变量:

 

(1)反引号字符(`)

 

(2)$()格式

 

例如:

 

linuxidc=`date`

linuxidc=$(date)

 

生成列表中所需值就是使用命令的输出。

 

#!/bin/bash

\# reading values from a file

 

file="states"

for state in $(cat $file)

do

echo "welcome $state"

done

 

states文件内容;

 

www.linuxidc.com

Hello World

Linuxmi com

linuxidc.net Linux公社

 

执行结果:

 

linuxidc@linuxidc:~/linuxidc.com$ ./linuxidc.sh

welcome www.linuxidc.com

welcome Hello

welcome World

welcome Linuxmi

 

# find的介绍2

 

linux中find工具其实非常强大, 平时用到的可能仅仅是它功能的很小的一部分. 最近稍微研究了一下它的用法.

 

find - search for files in a directory hierarchy

 

find 搜索目录树上的每一个文件名,它从左至右运算给定的表达式,按照优先规则(见运 算符OPERATORS一节)进行匹配,直到得出结果(左边运算在 ‘与’ 操作中得出假, 在’或’ 操作中得出真),然后 find 移向下一个文件名。

 

第一个以 ‘-’ , ‘(’ , ‘)’ , ‘,’ 或 ‘!’ 这些字符起始的参数是表达式的开始; 在它之前的任何参数是要搜索的路径,在它之后的任何参数都是表达式的余下部分。 如果没有路径参数,缺省用当前目录。如果没有表达式,缺省表达式 用 ‘-print’.

 

当所有文件都成功处理时 find 退出并返回状态值0。如果发生错误则返回一个大于0的值。

 

### synopsis(命令语法, 摘要, 或者说命令的套用句型)

 

在man 1 find中,可以看到find是这样的synopsis

 

```bash

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

1

```

 

今天主要研究find常用的, 不考虑一些细节的选项与用法, 因此本文只谈这样的:

**`find [starting-point...] [expression]`**

 

> find的命令句型就是:

> find   starting-point   expression  

> 记住这个, 很多就好理解了.

 

### starting-point说明

 

*starting-point指起始点, 也就是find查找文件时从哪个起始的路径开始查找*

 

比如

```

$ find / -name foo #从 根目录开始查找文件名为foo的文件

$ find /root/ -name foo # 从/root目录开始查找 名为foo的文件

当没有指定starting-point时, find就认为是"." (点, 即当前目录)

 

*另外, starting-point可以指定多个*

$ find / /root /etc -name foo.txt #从/, /root, /etc目录开始查找名字为foo.txt的文件

```

### expression说明

 

**EXPRESSION**

The part of the command line after the list of starting points is the expression. This is a kind of query specification describing how we match files and what we do with the files that were matched. An expression is composed of a sequence of things: Tests, Actions, Operators

在starting-point列表后面的, 就是expression, expression主要由 Tests, Actions, Operators 三部分组成.

 

**Tests**

Tests return a true or false value, usually on the basis of some property of a file we are considering. The -empty test for example is true only when the current file is empty.

 

**Actions**

Actions have side effects (such as printing something on the standard output) and return either true or false, usually based on whether or not they are successful. **The -print action for example prints the name of the current file on the standard output.**

 

**Operators**

Operators join together the other items within the expression. They include for example -o (meaning logical OR) and -a (meaning logical AND). **Where an operator is missing, -a is assumed.**

 

**If the whole expression contains no actions other than -prune or -print, -print is performed on all files for which the whole expression is true.**

 

### 常见的Tests举例

 

-name; -perm; -type; -path; -size; 等

 

### 常见的Actions举例

 

-prune; -print; -exec; -delete;

 

### 常见的Operators举例

 

-o; -or; -a; -and; !; -not; 等

运算优先级:

! (-not) 高于 -a(-and) 高于 -o(-or)

 

## find的举例及说明

 

$ find . -name foo.txt

含义: 在当前目录下, 查找名为foo.txt的文件.

这里面 . 是starting-point, -name foo.txt是Tests, 这条命令中没有Actions, 因此默认Actions就是-print. 即这条命令等同于

$ find . -name foo.txt -print 或

$ find . -name foo.txt -a -print

 

$ find /tmp -name core -type f -print

含义: 在/tmp目录中, 查找名为core, 同时类型为普通的文件.

这条命令中, /tmp是starting-point, -name core是Tests, -type f也是Tests, -print是Actions. 两个Tests之间没有任何Operator, 因此默认就是-a, 即这条命令等效于

$ find /tmp -name core -a -type f -print 或

$ find /tmp -name core -a -type f -a -print

 

$ find . -type f -exec file ‘{}’ \;

含义: 对当前目录, 查找类型为普通的文件(regular file), 并对每个文件, 执行 file操作 (file xxx表示 判定xxx是什么文件)

starting-point 是当前目录.

Tests是-type f

Actions是 -exec file ‘{}’ \;

 

$ find /sbin /usr/sbin -executable ! -readable -print

含义: 找出/sbin, /usr/sbin中, 具有可执行权限, 但没有可读权限的文件, 并打印出来.

Starting-point是 /sbin, /usr/sbin

Tests是 -executable 和 -readable

Operator有两个, 一个是!, 跟 -readable结合, 表示不可读的, 还有一个省略的-a

Actions是-print

这条命令等效于

$ find /sbin /usr/sbin -executable -a ! -readable -print或

$ find /sbin /usr/sbin -executable -a ! -readable -a -print

 

$ find . -perm 664

含义: Search for files which have read and write permission for their owner, and group, but which other users can read but not write to. Files which meet these criteria but have other permissions bits set (for example if someone can execute the file) will not be matched.

在当前目录中, 找出权限为664 (rw-rw-r–)的文件, 精确匹配.

Starting-point是.

Tests是 -perm 664

Actions是-print (省略了)

这条命令等效于

$ find . -perm 664 -print或

$ find . -perm 664 -a -print

 

## 参考

 

[https://www.cnblogs.com/huyuanblog/p/10136286.html](https://www.cnblogs.com/huyuanblog/p/10136286.html)

https://jlk.fjfi.cvut.cz/arch/manpages/man/find.1.zh_CN

[https://www.gnu.org/software/findutils/manual/html_mono/find.html#Base-Name-Patterns](https://www.gnu.org/software/findutils/manual/html_mono/find.html#Base-Name-Patterns)

https://www.gnu.org/software/findutils/manual/html_mono/find.html#Full-Name-Patterns


 

# find介绍3

Linux find Command

The Linux find command is a built in powerful tool that can be used to locate and manage files and directories based on a wide range of search criteria.

 

For example, we can find files by their name, extension, size, permissions, etc. We can also use the find command to search for a particular text inside a file which we don’t know the name of.

 

Let’s see some usage of the find command with examples:

 

Searching for a file by name

If you know the name of a file but can’t remember the directory it’s in you can use the following command from the root directory:

 

find . -name sales.csv

Sample output:

 

./accounts/sales.csv

Searching for a specific file in a directory

If you want to search for specific file(s) in a directory, we can use:

 

find ./test -name testCases*

Sample output:

 

./test/testCases10.txt

./test/testCasesPassed.txt

./test/testCasesFailed.log

In the above case, we are only searching within the “./test” directory.

 

Find files by extension

To search and find files by a certain extension we use:

 

find . -name *.jpg

Sample output:

 

./test/results/failedTests.jpg

./test/project.jpg

./home/profile_pic.jpg

./tmp/cute-cats.jpg

Find files or directories with certain names

To find only files, we need to use the -f option:

 

find ./ -type f -name "results*"

Sample output:

 

./test/results_latest.log

./test/results_archive.pdf

To find only directories, we need to use the -d option:

 

find ./ -type d -name "results*"

Sample output:

 

./test/results

Find files in multiple directories

If you want to search and list all files with a given name in multiple directories you can either start the search at root folder, or if you know the directories, you can specify them.

 

Example:

 

find ./test ./logs -name failed*.* -type f

Sample output:

 

./test/failed_tests.txt

./logs/failed_tests.log

Find files containing a certain text

Sometimes you want to find a file and you don’t know its name, but you know it has a certain text inside it.

 

You can use:

 

find ./test -type f -exec grep -l -i "login_scenarios" {} ;

Here, the -i option is used to ignore case, so Login_Scenarios and login_scenarios will both be found.

 

Find files by size

We can even find files by different sizes. Size options are:

 

c bytes

k kilobytes

M Megabytes

G Gigabytes

For example to find files on an exact size we use:

 

find / -size 10M

And to find files which are greater than a certain size, we use:

 

find ./test -size +2M

The above will find all the files which are greater than 2MB in the ./test folder.

 

Find and delete specific files

To find and delete specific files we use:

 

find . -type f -name "temp*" -exec rm {} ;

Conclusion

In this article you learned about how to use the linux find command to search for files based on name, extension, size and type.


 

# supervise的学习

# 官网

http://supervisord.org/introduction.html

 

# 为什么要用 supervisor

- 大家都说有这么个东西就自己学一下了

- celery 有说可以用 supervisor 后台运行

 

# supervisor查找配置文件的路径优先级

http://supervisord.org/configuration.html


 

# 运行supervisor

http://supervisord.org/running.html



这篇关于shell学习集合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程