# find命令

一般形式 
 <font color='red'>  find   pathname   -options     [-print   -exec -  ok] </font>
   -pathname :    find命令所查找的目录路径。如用"."来表示当前的目录，用/来表示系统根目录 
   -print :    find命令将匹配的文件输出到标准输出 
   -exec:      find命令对匹配的文件执行该参数所给出的shell命令，相应的命令形式为   'command'{} \; (注意{}和\之间的空格) 
   -ok 和 -exec的作用相同，只不过以一种更为安全的模式来执行该参数所给出的shell命令，在执行每一个命令之前，都会给出提示，让用户来确定是否执行。 
  options有如下几种： 
  -name ：按照文件名查找文件 
  -perm ：按照文件权限来查找文件 
  -user ：按照文件属主来查找文件 
  -group ：按照文件所属的组来查找文件 

-mtime -n +n 按照文件的更改时间来查找文件，-n表示文件更改时间距现在n天以内，+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项，但它们都和-mtime选项相似。 

  -size n[c]查找文件长度为n块的文件，带有c时表示文件长度以字节计。 
  -nogroup 查找无有效所属组的文件，即该文件所属的组在/etc/groups中不存在 
  -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件 
  -depth 先查找指定目录有无匹配文件，若无则再在子目录中查找 
  -type 查找某一类型的文件，如 
   b :块设备文件 
   d：目录 
   e：字符设备文件 
   p；管道文件 
   l：符号链接文件 
   f：普通文件 

## find命令举例 

  查找目录下的所有文件中是否含有某个字符串 

find .|xargs grep -ri "IBM" 
查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 
find .|xargs grep -ri "IBM" -l 



 find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上 
   find /cmd ".sh" -print 查找/cmd目录下所有sh文件，并输出 
   find . -perm 755 -print 查找当前目录下权限为755的文件，并输出 
   find `pwd` -user root -print 查找当前目录下属主为root的文件，并输出 
   find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件 
   find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件 
   find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件 
   find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新，但是比myfile2旧的所有文件。 
   find /var -type d -print 查找/var目录下所有目录 
   find /var -type l -print 查找/var目录下所有的符号链接文件。 
   find . -size +1000000c -print 查找当前目录下大于1000000字节的文件 
   find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找 
   find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件，若有则执行ls -l 

# xargs命令

在使用find命令的-exec选项处理匹配到的文件时，find命令将所有匹配到的文件一起传递给exec。不幸的是，有些系统对能够传递给exec的命 令长度有限制，这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在，特别是与 find命令一起使用,exec会发起多个进程，而xargs会多个，只有一个 
   find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理 

# grep命令

(1)grep 的一般格式为

<font color='red'> grep    - [options]    基本正则表达式     【文件]】</font>

   字符串参数最好采用是双引号括，一是以防被误解为shell命令，二是可以用来查找多个单词组成的字符串 
   -c：只输出匹配行的记数 
   -i：不区分大小写（只适用于单个字符） 
   -h：查询多个文件时不显示文件名 
   -H：只显示文件名 
   -l：查询多文件时只输出包含匹配字符的文件名 
   -n：只显示匹配行及其行号 
   -s：不显示不存在或无匹配文本的错误信息。 
   -v：显示不包含匹配文本的所有行。 

##  （2）举例说明： 

   grep ^[^210] myfile                   匹配myfile中以非2、1、0开头的行 
   grep "[5-8][6-9][0-3]" myfile           匹配myfile中第一位为5|6|7|8，第二位6|7|8|9，第三位为0|1|2|3的三个字符的行 
   grep "4\{2,4\}" myfile              匹配myfile中含有44,444或4444的行 
   grep "\?" myfile                      匹配myfile中含有任意字符的行 

   grep -l "asiainfo"   _*.cc_              Unix中在当前目录下所有.cc 的文件中找到含有“asiainfo”内容的文件，命令

 （3）grep命令类名 
   [[:upper:]]  表示[A-Z] 
   [[:alnum:]]  表示[0-9a-zA-Z] 
   [[:lower:]]  表示[a-z] 
   [[:space:]]  表示空格或者tab键 
   [[:digit:]]  表示[0-9] 
   [[:alpha:]]  表示[a-zA-Z] 
  如：grep "5[[:digit:]][[:digit:]]" myfile 匹配myfile中含有5开头接下去两位都是数字的行。 

# awk命令

可以从文件或字符串中基于指定规则浏览和抽取信息，是一种自解释的变成语言。 
（1）awk命令行方式 

<font color='red'>awk [选项参数] 'script' var=value file(s) </font>

<font color='red'> awk [选项参数] -f scriptfile var=value file(s)</font>

awk脚本：所有awk命令插入一个文件，并使awk程序可执行，然后用awk命令解释器作为脚本的首行，以便通过键入脚本名称来调用它。awk脚本是由各种操作和模式组成。 
  模式部分决定动作语句何时触发及触发事件。（BEGIN,END） 
  动作对数据进行处理，放在{}内指明（print） 
（2）分隔符、域和记录 
  awk执行时，其浏览域标记为$1,$2,...$n.这种方法成为域标识。$0为所有域。 

```
-F fs or --field-separator fs
 	指定输入文件折分隔符，fs是一个字符串或者是一个正则表达式，如-F:。
-v var=value or --asign var=value
 	赋值一个用户定义变量。
-f scripfile or --file scriptfile
 	从脚本文件中读取awk命令。
-mf nnn and -mr nnn
 	对nnn值设置内在限制，-mf选项限制分配给nnn的最大块数目；-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能，在标准awk中不适用。
-W compact or --compat, -W traditional or --traditional
 	在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样，所有的awk扩展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright
 	打印简短的版权信息。
-W help or --help, -W usage or --usage
 	打印全部awk选项和每个选项的简短说明。
-W lint or --lint
 	打印不能向传统unix平台移植的结构的警告。
-W lint-old or --lint-old
 	打印关于不能向传统unix平台移植的结构的警告。
-W posix
 	打开兼容模式。但有以下限制，不识别：/x、函数关键字、func、换码序列以及当fs是一个空格时，将新行作为一个域分隔符；操作符**和**=不能代替^和^=；fflush无效。
-W re-interval or --re-inerval
 	允许间隔正则表达式的使用，参考(grep中的Posix字符类)，如括号表达式[[:alpha:]]。
-W source program-text or --source program-text
 	使用program-text作为源代码，可与-f命令混用。
-W version or --version
 	打印bug报告信息的版本。
```



## （3）举例说明: 

   awk '{print $0}' test.txt |tee test.out 输出test.txt中所有行$0表示所有域 
   awk -F : '{print $1} test.txt |tee test.out'  同上。。只是分隔符为":" 
   awk 'BEGIN {print "IPDate\n"}{print $1 "\t" $4} END{print "end-of-report"}' test.txt 
   开始时打印“IPDate”结束时打印“end-of-report”中间打印主体信息，比如总共匹配三条信息，则输出如下：  
IPDate 
1 first 
2 second 
3 third 
end-of-report 
 （4）匹配操作符 ~ 匹配,!~ 不匹配 
   cat test.txt |awk '$0~/210.34.0.13/' 匹配test.txt中为210.34.0.13的行 
   awk '$0!~/210.34.0.13' test.txt   匹配test.txt中不是210.34.0.13的行 
   awk '{if($1=="210.34.0.13") print $0}' test.txt 匹配 test.txt中第一个域为210.34.0.13的行。

```
log.txt文本内容如下：
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

# 每行按空格或TAB分割，输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 
# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割，然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple
 
 
  $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s
 
 awk -f {awk脚本} {文件名}
 
  $ awk -f cal.awk log.txt
```



# sed命令

 sed不与初始化文件打交道，它操作的只是一个拷贝，然后所有的改动如果没有重定向到一个文件，将输出到屏幕。 
  sed是一种很重要的文本过滤工具，使用一行命令或者使用管道与grep与awk相结合。是一种非交互性文本流编辑。 
  （1）调用sed的三种方式 
   使用sed命令行格式为：sed [options] sed命令 输入文件 
   使用sed脚本文件格式为：sed[options] -f sed脚本文件 输入文件 
   sed脚本文件[options] 输入文件 
   --不管是使用shell命令行方式或脚本文件方式，如果没有指定输入文件，sed从标准输入中接受输入，一般是键盘或重定向结果。 
  （2）sed 命令的options如下 
    -n：不打印 
    -c：下一命令是编辑命令 
    -f：如果正在调用sed脚本文件 
  （3）sed在文件中查询文本的方式 
     --使用行号，可以是一个简单的数字，或是一个行号的范围 
     --使用正则表达式 
  （4）读取文本的方式 
     x    x为一行号 
     x,y    表示行号范围从x到y 
     /pattern/   查询包含模式的行 
     /pattern/pattern/ 查询包含两个模式的行 
     pattern/,x  在给定的行号上查询包含模式的行 
     x,/pattern/  通过行号和模式查询匹配行 
     x,y!    查询不包含指定行号x和y的行 
   （5）基本sed编辑命令 
      p  打印匹配行 
      d  删除匹配行 
      =  显示文件行号 
      a\  在定位行号后附加新文本信息 
      i\  在定位行号后插入新文本信息 
      c\  用新文本替换定位文本 
      s   使用替换模式替换相应模式 
      r   从另一个文件中读文件 
      w  写文本到一个文件 
      q   第一个模式匹配完成后推出或立即退出 
      l   显示与八禁止ASCII代码等价的控制字符 
      {}  在定位行执行的命令组 
      n   从另一个文件中读文本下一行，并附加在下一行 
      g   将模式2粘贴到/pattern n/ 
      y   传送字符 

##   （6）举例说明： 

​     要替换某文件的内容

```
sed -i ``'s/被替换的内容/要替换成的内容/'` `file
```

要替换某文件的内容切先复制再替换，以免替换出错

```
sed ``'s/被替换的内容/要替换成的内容/g'` `file > file.``out``mv file.``out` `file
```

批量查找并替换当前文件夹下的文件内容

`sed -i ``"s/要找查找的文本/替换后的文本/g"` ``grep -rl ``"要找查找的文本"` `./``

批量查找并替换任意文件夹下的文件内容

`sed -i ``"s/要找查找的文本/替换后的文本/g"` ``grep -rl ``"要找查找的文本"` `/任意文件夹``

```
打印第几行
[root@lin lin]# sed  -n 10p 67.txt
10  efasfg
```

sed -n '2p' test.txt 打印第二行的信息(注意：-n是不打印不匹配的信息，若没加-n，则打印文件的所有信息而不是匹配信息) 
     sed -n '1,4p' test.txt 打印第一行到第四行的信息 
     sed -n '/los/p' test.txt模式匹配los，并打印出来 
     sed -n '2,/los/p' test.txt 从第二行开始。。知道匹配第一个los 
     sed -n '/^$/p' test.txt 匹配空行 

​     sed -n '/g$/p' 67.txt         打印以g结尾的行

​     sed -n -e '/^$/p' -e '/^$/=' test.txt 打印空行及行号 
​     sed -n '/good/a\morning' test.txt 在匹配到的good后面附加morning 
​     sed -n '/good/i\morning' test.txt 在匹配到的good前面插入morning 
​     sed -n '/good/c\morning' test.txt 将匹配到的good替换成morning 
​     sed '1,2d' test.txt 删除第1和2行 
​     sed 's/good/good morning/g' test.txt 匹配good并替换成goodmorning 
​     send 's/good/& hello /p' test.txt 匹配到good就在其后面加上hello 
​     send 's/good/ hello &/p' test.txt 匹配到good就在其前面加上hello 



# 正则表达式 

 （1）正则表达式一般用来描述文本模式的特殊用法，由普通字符（例如字符a-z）以及特殊字符（称为元字符，如/、*、?等）组成。 
 （2）基本元字符集及其含义 
   ^ ：只匹配行首。  如^a 匹配以a开头的行abc,a2e,a12,aaa,...... 
   $ ：只匹配行尾。  如^a 匹配以a结尾的行bca,12a,aaa,....... 
   \* ：匹配0个或多个此单字符。 如(a)* 匹配 空，a,aa,aaa,.... 
   [] ：只匹配[]内字符。可以是一个单字符，也可以是字符序列，用","将里面要匹配的不同字符串分开。也可以使用-来表示[]内字符序列的范围，如[1-5]表示[12345] 
   \ ：只用来屏蔽一个元字符的特殊含义。 如\*,\',\",\|,\+,\^,\. 等 
   .：（点）只匹配任意单字符。 
   pattern\{n\}：只用来匹配前面pattern出现的次数.n为次数。如a\{2\}匹配aa. 
   pattern\{n,\}：含义同上，但次数最少为n.如a\{2,\}匹配aa,aaa,aaaa,..... 
   pattern\{n,m\}：含义同上，但次数在n和m之间。如a\{2,4\}匹配aa,aaa,aaaa三个 

##  (3)举例说明： 

   ^$ ：匹配空行 
   ^.$ ：匹配包含一个字符的行 
  \*\.pas ：匹配以*.pas结尾的所有字符或文件 
  [0123456789]或[0-9] ：假定要匹配任意一个数字 
  [a-z] ：任意小写字母 
  [A-Za-z] ：任意大小写字母 
  [S,s] ：匹配大小写S 
  [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} ：匹配IP地址 [0-9]\{3\}三个0-9组成的字符串；\. ：匹配点（注意这里点是特殊的字符，所以要用"\"来屏蔽其含义） 
2.find介绍  （1）查找具有某些特征文件的命令，可遍历当前目录甚至于整个文件系统来查看某些文件或目录，其遍历大的文件系统时一般放在后台执行。 



# 合并与分割

（sort,uniq,join,cut,paste,split）   

## (1)sot命令 

​    sort [options] files 许多不同的域按不同的列顺序排序 
​     -c 测试文件是否已经排序 
​     -m 合并两个排序文件 
​     -u 删除所有同样行 
​     -o 存储sort结果的输出文件名 
​     -t 域分隔符，用非空格或tab开始排序 
​     +n ：n 为列号，使用此列号开始排序 
​     -n 指定排序是域上的数字分类项 
​     -r 比较求逆 
​    sort -c test.txt 测试文件是否分类过 
​    sort -u test.txt 排序并合并一样的行 
​    sort -r test.txt 以相反的顺序排列 
​    sort -t "/" +2 test.txt 以"/"分隔，第二个域开始分类 

##    （2）uniq命令 

​     uniq [options ] files 从一个文本文件中去除或禁止重复行 
​     -u 只显示不重复行 
​     -d 只显示有重复数据行，每种重复行只显示其中一行 
​     -c 打印每一重复行出现次数 
​     -f ：n为数字，前n个域被忽略 
​     uniq -f 2 test.txt 忽略前2个域 

##    （3）join 命令 

​     join [options] file1 file2 用来将来自两个分类文本文件的行连在一起 
​     -an，n为一数字，用于连接时从文件n中显示不匹配行 
​     -onm ，连接域，n为文件号，m为域号 
​     -jnm，n为文件号，m为域号，使用其他域作连接域 
​     -t ，域分隔符。用来设置非空格或tab键的域分隔符。 

##     （4）split命令 

​     split -output_file_size intput_filename output_filename 
​     用来将大文件分割成小文件。 
​      -b n，每个分割文件的大小n 
​      -C n，每个分割文件一行最多n字节 
​      -l n，每个分割文件的行数 
​      -n，同-l n 
​      split -10 test.txt 将test.txt分割成10行的小文件 

##     （5）cut 命令 

​     cut -c n1-n2 filename 显示每行从开头算起 n1 到 n2 的文字。 

​     cut -c 3-5 test.txt 显示test.txt中每行从第3到第5个字符



# 删除文件空行的方法

```
使用 grep 命令
# grep . data.txt
# grep -v '^$' data.txt
# grep '[^$]' data.txt
使用 sed 命令
# sed  '/^$/d' data.txt
# sed '/^\s*$/d' data.txt   # 这个命令还可将完全空格、tab 等组成的空行删掉。
使用 awk 命令
# awk NF data.txt   # 这个也可以将空格、tab 等组成的空行删掉。
# awk '!/^$/' data.txt
使用 tr 命令
# tr -s '\n' < data.txt
```



# Linux系统下打印第n行的方法

方法一：cat

cat filename | head -n 5 | tail -n +5

方法二：sed

sed -n '5p' filename



扩展：打印第3~5行

cat filename | head -n 5 | tail -n +3

sed -n '3p;4p;5p' filename

sed -n '3,5p' filename 



# VMware下克隆centos7后的IP相同问题

#### 1、修改IP地址、删除[UUID](https://so.csdn.net/so/search?q=UUID&spm=1001.2101.3001.7020)和HWADDR两行

命令： vi /etc/sysconfig/network-scripts/ifcfg-ens32  （不同电脑中ifcfg-ens32文件名称不同，可通过上一级目录查看）

进入网卡配置文件中修改IPADDR的值为新地址（新ip地址不可与原来ip地址冲突），并删除文件中的UUID和HWADDR两行（我进入到这个文件中的时候，并没有HWADDR，所以只删除了UUID一行）；

保存、退出；

此图为修改后IP后、删除UUID后的图

命令：service network restart （<font color='red'>重启网络</font>），该步骤一定不可以忘记！

#### 2、修改[主机名](https://so.csdn.net/so/search?q=主机名&spm=1001.2101.3001.7020)

方法一：命令：hostnamectl set-hostname node02；(node02为新主机名)

方法二：命令：vi /etc/hostname ,进去之后将原来的主机名修改成新的主机名后，保存、退出。（vi编辑器的使用请自行搜索）

#### 3、修改[虚拟机](https://so.csdn.net/so/search?q=虚拟机&spm=1001.2101.3001.7020)IP地址与主机名的映射

获取主机名： 命令：hostname

获取ip： 命令：ip add

查看映射关系： cat /etc/hosts

修改映射关系： vi /etc/hosts (此处已经修改过，仅供参考，不再修改)

# echo $?

判断上一条命令是否执行成功

输出0成功

其他数字不成功







# ps命令

```
ps [options] [--help]
```

**参数**：

- ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义

- -A 列出所有的进程

- -w 显示加宽可以显示较多的资讯

- -au 显示较详细的资讯

- -aux 显示所有包含其他使用者的进程

- au(x) 输出格式 :

  ```
  USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  ```

  - USER: 行程拥有者
  - PID: pid
  - %CPU: 占用的 CPU 使用率
  - %MEM: 占用的记忆体使用率
  - VSZ: 占用的虚拟记忆体大小
  - RSS: 占用的记忆体大小
  - TTY: 终端的次要装置号码 (minor device number of tty)
  - STAT: 该行程的状态:
    - D: 无法中断的休眠状态 (通常 IO 的进程)
    - R: 正在执行中
    - S: 静止状态
    - T: 暂停执行
    - Z: 不存在但暂时无法消除
    - W: 没有足够的记忆体分页可分配
    - <: 高优先序的行程
    - N: 低优先序的行程
    - L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
  - START: 行程开始时间
  - TIME: 执行的时间
  - COMMAND:所执行的指令

### 实例

查找指定进程格式：

```
ps -ef | grep 进程关键字
```

例如显示 php 的进程：

```
# ps -ef | grep php
root       794     1  0  2020 ?        00:00:52 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
www-data   951   794  0  2020 ?        00:24:15 php-fpm: pool www
www-data   953   794  0  2020 ?        00:24:14 php-fpm: pool www
www-data   954   794  0  2020 ?        00:24:29 php-fpm: pool www
...
```

显示进程信息：

```
# ps -A 
PID TTY     TIME CMD
  1 ?    00:00:02 init
  2 ?    00:00:00 kthreadd
  3 ?    00:00:00 migration/0
  4 ?    00:00:00 ksoftirqd/0
  5 ?    00:00:00 watchdog/0
  6 ?    00:00:00 events/0
  7 ?    00:00:00 cpuset
  8 ?    00:00:00 khelper
  9 ?    00:00:00 netns
  10 ?    00:00:00 async/mgr
  11 ?    00:00:00 pm
  12 ?    00:00:00 sync_supers
  13 ?    00:00:00 bdi-default
  14 ?    00:00:00 kintegrityd/0
  15 ?    00:00:02 kblockd/0
  16 ?    00:00:00 kacpid
  17 ?    00:00:00 kacpi_notify
  18 ?    00:00:00 kacpi_hotplug
  19 ?    00:00:27 ata/0
……省略部分结果
30749 pts/0  00:00:15 gedit
30886 ?    00:01:10 qtcreator.bin
30894 ?    00:00:00 qtcreator.bin 
31160 ?    00:00:00 dhclient
31211 ?    00:00:00 aptd
31302 ?    00:00:00 sshd
31374 pts/2  00:00:00 bash
31396 pts/2  00:00:00 ps
```

显示指定用户信息

```
# ps -u root //显示root进程用户信息
 PID TTY     TIME CMD
  1 ?    00:00:02 init
  2 ?    00:00:00 kthreadd
  3 ?    00:00:00 migration/0
  4 ?    00:00:00 ksoftirqd/0
  5 ?    00:00:00 watchdog/0
  6 ?    00:00:00 events/0
  7 ?    00:00:00 cpuset
  8 ?    00:00:00 khelper
  9 ?    00:00:00 netns
  10 ?    00:00:00 async/mgr
  11 ?    00:00:00 pm
  12 ?    00:00:00 sync_supers
  13 ?    00:00:00 bdi-default
  14 ?    00:00:00 kintegrityd/0
  15 ?    00:00:02 kblockd/0
  16 ?    00:00:00 kacpid
……省略部分结果
30487 ?    00:00:06 gnome-terminal
30488 ?    00:00:00 gnome-pty-helpe
30489 pts/0  00:00:00 bash
30670 ?    00:00:00 debconf-communi 
30749 pts/0  00:00:15 gedit
30886 ?    00:01:10 qtcreator.bin
30894 ?    00:00:00 qtcreator.bin 
31160 ?    00:00:00 dhclient
31211 ?    00:00:00 aptd
31302 ?    00:00:00 sshd
31374 pts/2  00:00:00 bash
31397 pts/2  00:00:00 ps
```

显示所有进程信息，连同命令行

```
# ps -ef //显示所有命令，连带命令行
UID    PID PPID C STIME TTY     TIME CMD
root     1   0 0 10:22 ?    00:00:02 /sbin/init
root     2   0 0 10:22 ?    00:00:00 [kthreadd]
root     3   2 0 10:22 ?    00:00:00 [migration/0]
root     4   2 0 10:22 ?    00:00:00 [ksoftirqd/0]
root     5   2 0 10:22 ?    00:00:00 [watchdog/0]
root     6   2 0 10:22 ?    /usr/lib/NetworkManager
……省略部分结果
root   31302 2095 0 17:42 ?    00:00:00 sshd: root@pts/2 
root   31374 31302 0 17:42 pts/2  00:00:00 -bash
root   31400   1 0 17:46 ?    00:00:00 /usr/bin/python /usr/sbin/aptd
root   31407 31374 0 17:48 pts/2  00:00:00 ps -ef
```





# telnet命令

Linux telnet命令用于远端登入。

执行telnet指令开启终端机阶段作业，并登入远端主机。

### 语法

```
telnet [-8acdEfFKLrx][-b<主机别名>][-e<脱离字符>][-k<域名>][-l<用户名称>][-n<记录文件>][-S<服务类型>][-X<认证形态>][主机名称或IP地址<通信端口>]
```

**参数说明**：

- -8 允许使用8位字符资料，包括输入与输出。
- -a 尝试自动登入远端系统。
- -b<主机别名> 使用别名指定远端主机名称。
- -c 不读取用户专属目录里的.telnetrc文件。
- -d 启动排错模式。
- -e<脱离字符> 设置脱离字符。
- -E 滤除脱离字符。
- -f 此参数的效果和指定"-F"参数相同。
- -F 使用Kerberos V5认证时，加上此参数可把本地主机的认证数据上传到远端主机。
- -k<域名> 使用Kerberos认证时，加上此参数让远端主机采用指定的领域名，而非该主机的域名。
- -K 不自动登入远端主机。
- -l<用户名称> 指定要登入远端主机的用户名称。
- -L 允许输出8位字符资料。
- -n<记录文件> 指定文件记录相关信息。
- -r 使用类似rlogin指令的用户界面。
- -S<服务类型> 设置telnet连线所需的IP TOS信息。
- -x 假设主机有支持数据加密的功能，就使用它。
- -X<认证形态> 关闭指定的认证形态。

### 实例

登录远程主机

```
# telnet 192.168.0.5 

//登录IP为 192.168.0.5 的远程主机
```



# showmount命令

**常用参数：**

| -d   | 仅显示已被NFS客户端加载的目录 |
| ---- | ----------------------------- |
| -e   | 显示NFS服务器上所有的共享目录 |

**参考实例**

获取已经被客户端加载的NFS共享目录：

```
[root@linuxcool ~]# showmount -d 61.163.231.197
```

获取NFS服务器的全部共享目录：

```
[root@linuxcool ~]# showmount -e 61.163.231.197
```

# 生成空文件

```
[root@exercise1 opt]# dd if=/dev/zero of=b.txt bs=1M count=50
记录了50+0 的读入
记录了50+0 的写出
52428800字节(52 MB)已复制，0.642576 秒，81.6 MB/秒
[root@exercise1 opt]# du -sh b.txt 
50M	b.txt
[root@exercise1 opt]# cat b.txt   #什么也不显示
```



![image-20220822142544030](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202208221425121.png)

95行修改为本机IP





# mysql

### mysql怎么查询不为空的字段

1、查询不为空

```
select * from table where id <> "";
select * from table where id != "";
```

2、查询为空

```
select * from table where id ="";
select * from table where isNull(id);
```

如果字段是char或者varchar类型的，使用id=""可以的；如果字段是int类型的，使用isNull会好些。



alter table 表名称 change 字段名称 新字段名称 字段类型 [是否允许非空];
alter table 表名称 modify 字段名称 字段类型 [是否允许非空];

扩展

创建数据库
>CREATE DATABASE database-name

删除数据库
>drop database dbname

查询所有数据表
>show tables;

查询表的字段信息
>desc 表名称;

添加表字段
>alter table table1 add transactor varchar(10) not Null;
>alter table table1 add id int unsigned not Null auto_increment primary key

如果要删除某一字段，可用命令：
>ALTER TABLE 表名称 DROP 字段名;

创建新表
>create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

删除新表
>drop table tabname

增加一个列
>Alter table 表名 add column 列名 类型
>注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。

删除列：
>alter table 表名 drop column 列名;

//SQL与Mysql添加删除列区别，以下为SQL操作
//ALTER TABLE 表名   ADD 字段名
//ALTER TABLE 表名   DROP COLUMN  字段名

添加主键： 
>Alter table tabname add primary key(col)
>
>删除主键： 
>Alter table tabname drop primary key(col)

创建索引：
>create [unique] index idxname on tabname(col….)

删除索引：
>drop index idxname
>注：索引是不可更改的，想更改必须删除重新建。

创建视图：
>create view viewname as select statement

几个简单的基本的sql语句
选择：select * from table1 where 范围
插入：insert into table1(field1,field2) values(value1,value2)
删除：delete from table1 where 范围
更新：update table1 set field1=value1 where 范围
查找：select * from table1 where field1 like ’%value1%’ ---like的语法很精妙，查资料!
排序：select * from table1 order by field1,field2 [desc]
总数：select count as totalcount from table1
求和：select sum(field1) as sumvalue from table1
平均：select avg(field1) as avgvalue from table1
最大：select max(field1) as maxvalue from table1
最小：select min(field1) as minvalue from table1

使用外连接
A、left （outer） join：
左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B：right （outer） join:
右外连接(右连接)：结果集既包括连接表的匹配连接行，也包括右连接表的所有行。
C：full/cross （outer） join：
全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。

分组Group by:
  一张表，一旦分组完成后，查询后只能得到组相关的信息。
 组相关的信息：（统计信息） count,sum,max,min,avg  分组的标准)
    在SQLServer中分组时：不能以text,ntext,image类型的字段作为分组依据
 在selecte统计函数中的字段，不能和普通的字段放在一起；

如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'

数据开发-经典

1.按姓氏笔画排序:
>Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多



## 查找所有重复标题的记录：

select title,count(*) as count from user_table group by title having count>1;
SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) > 1) ORDER BY Title DESC
一、查找重复记录
1、查找全部重复记录

SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) > 1) ORDER BY Title DESC
2、过滤重复记录(只显示一条)

Select * From HZT Where ID In (Select Max(ID) From HZT Group By Title)
注：此处显示ID最大一条记录

二、删除重复记录
1、删除全部重复记录(慎用)

Delete 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)
2、保留一条(这个应该是大多数人所需要的 _)

Delete HZT Where ID Not In (Select Max(ID) From HZT Group By Title)
注：此处保留ID最大一条记录

三、举例
1、查找表中多余的重复记录，重复记录是根据单个字段(peopleId)来判断

select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
2、删除表中多余的重复记录，重复记录是根据单个字段(peopleId)来判断，只留有rowid最小的记录

delete from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
3、查找表中多余的重复记录(多个字段)

select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
4、删除表中多余的重复记录(多个字段)，只留有rowid最小的记录

delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
5、查找表中多余的重复记录(多个字段)，不包含rowid最小的记录

select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
四、补充
有两个以上的重复记录，一是完全重复的记录，也即所有字段均重复的记录，二是部分关键字段重复的记录，比如Name字段重复，而其他字段不一定重复或都重复可以忽略。

1、对于第一种重复，比较容易解决，使用

select distinct * from tableName
就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保留1条)，可以按以下方法删除

select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp
发生这种重复的原因是表设计不周产生的，增加唯一索引列即可解决。

2、这类重复问题通常要求保留重复记录中的第一条记录，操作方法如下

假设有重复的字段为Name,Address，要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName select min(autoID) as autoID into #Tmp2 from #Tmp group 



# diff命令

```
diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
```

**参数**：

- -<行数> 　指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
- -a或--text 　diff预设只会逐行比较文本文件。
- -b或--ignore-space-change 　不检查空格字符的不同。
- -B或--ignore-blank-lines 　不检查空白行。
- -c 　显示全部内文，并标出不同之处。
- -C<行数>或--context<行数> 　与执行"-c-<行数>"指令相同。
- -d或--minimal 　使用不同的演算法，以较小的单位来做比较。
- -D<巨集名称>或ifdef<巨集名称> 　此参数的输出格式可用于前置处理器巨集。
- -e或--ed 　此参数的输出格式可用于ed的script文件。
- -f或-forward-ed 　输出的格式类似ed的script文件，但按照原来文件的顺序来显示不同处。
- -H或--speed-large-files 　比较大文件时，可加快速度。
- -I<字符或字符串>或--ignore-matching-lines<字符或字符串> 　若两个文件在某几行有所不同，而这几行同时都包含了选项中指定的字符或字符串，则不显示这两个文件的差异。
- -i或--ignore-case 　不检查大小写的不同。
- -l或--paginate 　将结果交由pr程序来分页。
- -n或--rcs 　将比较结果以RCS的格式来显示。
- -N或--new-file 　在比较目录时，若文件A仅出现在某个目录中，预设会显示：
- Only in目录：文件A若使用-N参数，则diff会将文件A与一个空白的文件比较。
- -p 　若比较的文件为C语言的程序码文件时，显示差异所在的函数名称。
- -P或--unidirectional-new-file 　与-N类似，但只有当第二个目录包含了一个第一个目录所没有的文件时，才会将这个文件与空白的文件做比较。
- -q或--brief 　仅显示有无差异，不显示详细的信息。
- -r或--recursive 　比较子目录中的文件。
- -s或--report-identical-files 　若没有发现任何差异，仍然显示信息。
- -S<文件>或--starting-file<文件> 　在比较目录时，从指定的文件开始比较。
- -t或--expand-tabs 　在输出时，将tab字符展开。
- -T或--initial-tab 　在每行前面加上tab字符以便对齐。
- -u,-U<列数>或--unified=<列数> 　以合并的方式来显示文件内容的不同。
- -v或--version 　显示版本信息。
- -w或--ignore-all-space 　忽略全部的空格字符。
- -W<宽度>或--width<宽度> 　在使用-y参数时，指定栏宽。
- -x<文件名或目录>或--exclude<文件名或目录> 　不比较选项中所指定的文件或目录。
- -X<文件>或--exclude-from<文件> 　您可以将文件或目录类型存成文本文件，然后在=<文件>中指定此文本文件。
- -y或--side-by-side 　以并列的方式显示文件的异同之处。
- --help 　显示帮助。
- --left-column 　在使用-y参数时，若两个文件某一行内容相同，则仅在左侧的栏位显示该行内容。
- --suppress-common-lines 　在使用-y参数时，仅显示不同之处。

### 实例1：比较两个文件

```
[root@localhost test3]# diff log2014.log log2013.log 
3c3
< 2014-03
---
> 2013-03
8c8
< 2013-07
---
> 2013-08
11,12d10
< 2013-11
< 2013-12
```

上面的"3c3"和"8c8"表示log2014.log和log20143log文件在3行和第8行内容有所不同；"11,12d10"表示第一个文件比第二个文件多了第11和12行。

### 实例2：并排格式输出

```
[root@localhost test3]# diff log2014.log log2013.log  -y -W 50
2013-01                 2013-01
2013-02                 2013-02
2014-03               | 2013-03
2013-04                 2013-04
2013-05                 2013-05
2013-06                 2013-06
2013-07                 2013-07
2013-07               | 2013-08
2013-09                 2013-09
2013-10                 2013-10
2013-11               <
2013-12               <
[root@localhost test3]# diff log2013.log log2014.log  -y -W 50
2013-01                 2013-01
2013-02                 2013-02
2013-03               | 2014-03
2013-04                 2013-04
2013-05                 2013-05
2013-06                 2013-06
2013-07                 2013-07
2013-08               | 2013-07
2013-09                 2013-09
2013-10                 2013-10
                      > 2013-11
                      > 2013-12
```

**说明：**

- "|"表示前后2个文件内容有不同
- "<"表示后面文件比前面文件少了1行内容
- ">"表示后面文件比前面文件多了1行内容



# 三方免密

三台linux之间免密 SSH 登录
注意：文中的node1、node2、node3均为linux相应的IP地址，做了域名映射。
第一步：三台机器生成公钥与私钥

在三台机器执行以下命令，生成公钥与私钥

```
ssh-keygen -t rsa
```

执行该命令之后，按下三个回车即可，然后敲（三个回车），就会生成两个文件id_rsa（私钥）、id_rsa.pub（公钥），默认保存在/root/.ssh目录。
第二步：拷贝公钥到同一台机器
三台机器拷贝公钥到第一台机器
三台机器分别执行下面命令：

```
ssh-copy-id node1
```


在执行该命令之后，需要输入yes和node1的密码:
第三步:复制第一台机器的认证到其他机器
将第一台机器的公钥拷贝到其他机器上
在第一台机器上执行以下命令

```
scp /root/.ssh/authorized_keys node2:/root/.ssh
scp /root/.ssh/authorized_keys node3:/root/.ssh
```


执行命令时，需要输入yes和对方的密码

第四步:测试SSH免密登录
可以在任何一台主机上通过ssh 主机名命令去远程登录到该主机，输入exit退出登录
例如：在node1机器上，免密登录到node2机器上

```
ssh node1
exit
```



# 别名映射

```
vim /etc/hosts
添加 ：ip+主机名
192.168.110.145  MySQL01
```

# Linux swapoff命令

Linux swapoff命令用于关闭系统交换区(swap area)。

swapoff实际上为swapon的符号连接，可用来关闭系统的交换区。

### 语法

```
swapoff [设备]
```

**参数：**

- -a 将/etc/fstab文件中所有设置为swap的设备关闭
- -h 帮助信息
- -V 版本信息

### 实例

显示分区信息:

```
# sfdisk -l //显示分区信息

Disk /dev/sda: 1305 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

  Device Boot Start   End  #cyls  #blocks  Id System
/dev/sda1  *   0+   12   13-  104391  83 Linux
/dev/sda2     13  1304  1292  10377990  8e Linux LVM
/dev/sda3     0    -    0     0  0 Empty
/dev/sda4     0    -    0     0  0 Empty

Disk /dev/sdb: 652 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition
No partitions found
```

关闭交换分区。

```
# swapoff /dev/sda2 // 关闭交换分区
```



# Linux swapon命令

Linux swapon命令用于激活Linux系统中交换空间，Linux系统的内存管理必须使用交换区来建立虚拟内存。

### 语法

```
/sbin/swapon -a [-v]
/sbin/swapon [-v] [-p priority] specialfile ...
/sbin/swapon [-s]
```

**参数说明：**

- -h 请帮帮我
- -V 显示版本讯息
- -s 显示简短的装置讯息
- -a 自动启动所有SWAP装置
- -p 设定优先权，你可以在0到32767中间选一个数字给他。或是在 /etc/fstab 里面加上 pri=[value] ([value]就是0~32767中间一个数字)，然后你就可以很方便的直接使用 swapon -a 来启动他们，而且有优先权设定。

swapon 是开启swap.

相对的,便有一个关闭swap的指令,swapoff.

![image-20221021105455600](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210211054692.png)

![image-20221021143549406](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210211435471.png)

![image-20221021145231873](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210211452920.png)

![image-20221021151328706](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210211513775.png)

![image-20221021161843643](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210211618744.png)

![image-20221021161849530](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210211618586.png)
