文章目录

  • 6.linuxShell的基本操作
    • 6.1 查看目录和文件
      • 6.1.1 显示当前目录:pwd
      • 6.1.2 改变目录:cd
      • 6.1.3 列出目录内容:ls
        • 1) 查看列表信息 以及详细信息
        • 2) 查看列表的不详细信息包括隐藏目录
        • 3) 查看列表所有详细信息包括隐藏目录
        • 4) 将 ls -l 命令结果反过来显示
        • 5) 按照更新时间降序排序
        • 6) 按照更新时间升序排序【r:反转】
        • 7) 查看一下当前家目录和其他指定目录
        • 8) 根据相对路径来定位,查看具体路径下的列表
      • 6.1.4 查看文本文件:cat
      • 6.1.5 阅读文件的开头:head
        • 1) 默认展示10行内容
        • 2) 根据自定义行数展示
        • 3) 按字节数展示
      • 6.1.6 阅读文件的结尾 和 循环查看新日志:tail
        • 1) 默认读取文件尾部的10行数据
        • 2) 从文件的第二行开始展示数据
        • 3) 循环展示数据
      • 6.1.7 更好的文本阅读工具:less
        • 1)浏览文件,并显示文件的百分比
        • 2)浏览文件,并显示每行的行号
        • 3) 打开文件后,向下查询“server”字符串,按n键继续找,按N键反向找
        • 4) 打开文件后,向上查询“server”字符串
      • 6.1.8 查找文件内容:grep
        • 1) 在server.xml中查询包含8080字样的行,并显示行号,并且查询包含 8080 8009 8843 这些行的数据
        • 2) 查询包含hello的行 然后不区分大小写再次查询包含hello的行 并统计出现了多少行
        • 3) 显示不包含hello的行数 并且统计行数
        • 4) 匹配以 yyyy开头, 以 hadoop 结尾的行
        • 5) 查询包含 c到f 区间字母的行
        • 6) 模糊匹配
        • 7) 特殊字符匹配
      • 6.1.9 文本分析工具:AWK
        • 1) 每行按空格或TAB分割,输出文本中的1、4项
        • 2) 使用 , 进行数据的获取
        • 3) 使用 空格 和 , 进行数据获取
        • 4) 通过grep查询 然后获取想要的数据
        • 5) 将想要的数据输出的文件中去
      • 思考题 : awk 怎么展示最后一列的数据呢?
    • 6.2 文本编辑工具:SED
      • 6.2.1 实例
        • 1) 在file1的第四行添加一行数据
        • 2) 以行为单位的新增/删除
        • 3) 只要删除第 2 行
        • 4) 要删除第 3 到最后一行
      • 6.2.2 以行为单位的替换与显示
      • 6.2.3 数据的搜寻并显示
      • 6.2.4 数据的搜寻并删除
      • 6.2.5 数据的搜寻并执行命令
      • 6.2.6 数据的搜寻并替换
    • 6.3 文件查询命令 find 命令
      • 6.3.1 模糊查询案例
      • 6.3.2 按文件所属的UID或者用户名查询
      • 6.3.3 按文件的类型查询
      • 6.3.4 按文件新旧程度查询
    • 6.4 查找特定程序:whereis
    • 6.5 查找可执行文件:which
    • 6.6 用户及版本信息查看
      • 6.6.1 用户信息查看:who 和 whoami
      • 6.6.2 系统版本信息查看:uname
    • 6.7 寻求帮助:man

6.linuxShell的基本操作

6.1 查看目录和文件

6.1.1 显示当前目录:pwd

Linux中用 pwd 命令来查看”当前工作目录“的完整路径。 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录。
在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。
命令格式:

pwd [-参数]

参数:
一般情况下不带任何参数
如果目录是链接时:
格式:pwd -P 显示出实际路径,而非使用链接(link)路径。

示例:
查看链接文件与真实文件的目录位置

[user4@localhost ~]$ pwd
/home/user4
[root@localhost ~]# su - user4
上一次登录:四 5月 30 20:17:44 CST 2019pts/0 上
[user4@localhost ~]$ ll
总用量 0
[user4@localhost ~]$ ln -s /etc/sysconfig/network-scripts/ link1
[user4@localhost ~]$ ll
总用量 0
lrwxrwxrwx. 1 user4 user4 31 5月  30 20:18 link1 -> /etc/sysconfig/network-scripts/
[user4@localhost ~]$ cd link1/
[user4@localhost link1]$ pwd
/home/user4/link1
[user4@localhost link1]$ pwd -P
/etc/sysconfig/network-scripts

6.1.2 改变目录:cd

切换当前目录到目标目录。代替了鼠标的双击
命令格式:

cd 目标目录(绝对路径)

其中:目标目录可以是
. 代表当前目录
… 代表上一层目录

  • 代表前一个工作目录
    ~ 代表『目前用户身份』所在的家目录
    相对路径的作用即使简化目录位置的编写
    比如说 ,你要想查看 user1 家目录下的d1目录下的file1这个文件
    如果登录用户是user1
    执行绝对路径是这样的
 cat /home/user1/d1/file1

如果使用相对路径

cat ~/d1/file1

从上面的描述不难看出有些时候使用相对路径是相当省事的!
举个例子 :

[user4@localhost ~]$ cd link1/
[user4@localhost link1]$ cd ..
[user4@localhost ~]$ cd ./link1/
[user4@localhost link1]$ cd -
/home/user4
[user4@localhost ~]$ cd /etc/sysconfig/
[user4@localhost sysconfig]$ cd -
/home/user4
[user4@localhost ~]$ cd /etc/sysconfig/
[user4@localhost sysconfig]$ cd ..
[user4@localhost etc]$

6.1.3 列出目录内容:ls

ls命令是linux下最常用的命令。ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单。

如果ls指定其他目录,那么就会显示指定目录里的文件及目录清单。

通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)、查看目录信息等等。
ls 命令在日常的linux操作中用的很多!
命令格式:

ls [-参数] [目录名]

命令格式:
列出目标目录中所有的子目录和文件,如果不写目录名,默认是当前路径。

常用参数:
-a:–all 列出目录下的所有文件,包括以 . 开头的隐藏文件
-l :除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来。
-r,:–reverse 依相反次序排列
-t :以文件修改时间排序

实例 :

1) 查看列表信息 以及详细信息

[user4@localhost /]$ ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  userhome  usr  var
[user4@localhost /]$ ls -l /
总用量 16
lrwxrwxrwx.   1 root root    7 5月  30 12:25 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 5月  30 12:28 boot
drwxr-xr-x.  20 root root 3220 5月  30 12:29 dev
drwxr-xr-x.  74 root root 8192 5月  30 17:43 etc
....其他的略
[user4@localhost /]$ ll
总用量 16
lrwxrwxrwx.   1 root root    7 5月  30 12:25 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 5月  30 12:28 boot
drwxr-xr-x.  20 root root 3220 5月  30 12:29 dev
drwxr-xr-x.  74 root root 8192 5月  30 17:43 etc
drwxr-xr-x.   7 root root   71 5月  30 16:36 home
....其他的显示略

2) 查看列表的不详细信息包括隐藏目录

[user4@localhost /]$ ls -a
.  ..  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  userhome  usr  var

3) 查看列表所有详细信息包括隐藏目录

[user4@localhost /]$ ls -la
总用量 16
dr-xr-xr-x.  18 root root  240 5月  30 16:47 .
dr-xr-xr-x.  18 root root  240 5月  30 16:47 ..
lrwxrwxrwx.   1 root root    7 5月  30 12:25 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 5月  30 12:28 boot
drwxr-xr-x.  20 root root 3220 5月  30 12:29 dev
drwxr-xr-x.  74 root root 8192 5月  30 17:43 etc
drwxr-xr-x.   7 root root   71 5月  30 16:36 home
... 其他的显示略
[user4@localhost /]$ ll -a
总用量 16
dr-xr-xr-x.  18 root root  240 5月  30 16:47 .
dr-xr-xr-x.  18 root root  240 5月  30 16:47 ..
lrwxrwxrwx.   1 root root    7 5月  30 12:25 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 5月  30 12:28 boot
drwxr-xr-x.  20 root root 3220 5月  30 12:29 dev
drwxr-xr-x.  74 root root 8192 5月  30 17:43 etc
drwxr-xr-x.   7 root root   71 5月  30 16:36 home
... 其他的显示略

4) 将 ls -l 命令结果反过来显示

[user4@localhost /]$ ll -ar
总用量 16
drwxr-xr-x.  19 root root  267 5月  30 12:29 var
drwxr-xr-x.  13 root root  155 5月  30 12:25 usr
drwxr-xr-x.   4 root root   32 5月  30 16:47 userhome
drwxrwxrwt.   8 root root  211 5月  30 14:05 tmp
dr-xr-xr-x.  13 root root    0 5月  30 12:29 sys
.......省略其他显示
​
[user4@localhost /]$ ls -alr
总用量 16
drwxr-xr-x.  19 root root  267 5月  30 12:29 var
drwxr-xr-x.  13 root root  155 5月  30 12:25 usr
drwxr-xr-x.   4 root root   32 5月  30 16:47 userhome
drwxrwxrwt.   8 root root  211 5月  30 14:05 tmp
dr-xr-xr-x.  13 root root    0 5月  30 12:29 sys
drwxr-xr-x.   2 root root    6 4月  11 2018 srv
.......省略其他显示

5) 按照更新时间降序排序

[user4@localhost /]$ ls -alt
总用量 16
drwxr-xr-x.  74 root root 8192 5月  30 17:43 etc
drwxr-xr-x.   4 root root   32 5月  30 16:47 userhome
dr-xr-xr-x.  18 root root  240 5月  30 16:47 .
dr-xr-xr-x.  18 root root  240 5月  30 16:47 ..
drwxr-xr-x.   7 root root   71 5月  30 16:36 home
drwxrwxrwt.   8 root root  211 5月  30 14:05 tmp
... 其他显示略

6) 按照更新时间升序排序【r:反转】

[user4@localhost /]$ ls -alrt
总用量 16
drwxr-xr-x.   2 root root    6 4月  11 2018 srv
drwxr-xr-x.   2 root root    6 4月  11 2018 opt
drwxr-xr-x.   2 root root    6 4月  11 2018 mnt
drwxr-xr-x.   2 root root    6 4月  11 2018 media
lrwxrwxrwx.   1 root root    7 5月  30 12:25 bin -> usr/bin
...... 其他显示略

7) 查看一下当前家目录和其他指定目录

[user4@localhost /]$ ls ~
link1
[user4@localhost /]$ ls /etc/sysconfig/network-scripts/
ifcfg-ens33  ifdown-ippp  ifdown-routes    ifup          ifup-ipv6   ifup-ppp       ifup-tunnel
ifcfg-lo     ifdown-ipv6  ifdown-sit       ifup-aliases  ifup-isdn   ifup-routes    ifup-wireless
ifdown       ifdown-isdn  ifdown-Team      ifup-bnep     ifup-plip   ifup-sit       init.ipv6-global
ifdown-bnep  ifdown-post  ifdown-TeamPort  ifup-eth      ifup-plusb  ifup-Team      network-functions
ifdown-eth   ifdown-ppp   ifdown-tunnel    ifup-ippp     ifup-post   ifup-TeamPort  network-functions-ipv6

8) 根据相对路径来定位,查看具体路径下的列表

[user4@localhost /]$ cd ~
[user4@localhost ~]$ ls ..
user1  user2  user3  user4  user5

6.1.4 查看文本文件:cat

cat 用于查看文件内容,通常是个文本文件,且文件不大。
命令格式:

cat [-参数] 文件名

参数:
-b, --number-nonblank 对非空输出行编号
-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号

[user4@localhost ~]$ touch file1
[user4@localhost ~]$ vi file1
(按i键编辑)
java
hadoop
​
HTML
jQuery
(按esc退出编辑 输入:wq 保存)
[user4@localhost ~]$ cat file1
java
hadoop
​
HTML
jQuery
[user4@localhost ~]$ cat -b file11  java2  hadoop
​3  HTML4  jQuery
[user4@localhost ~]$ cat -n file11  java2  hadoop3  4  HTML5  jQuery

6.1.5 阅读文件的开头:head

head 用来显示档案的开头至标准输出中。
命令格式:

head [-参数] 文件名

命令功能:
head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
参数:
-c<字节> 显示字节数
-n<行数> 显示的行数

示例:
上传tomcat的server.xml文件(ftp)

1) 默认展示10行内容

[user4@localhost ~]$ head server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements.  See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License.  You may obtain a copy of the License at
​
http://www.apache.org/licenses/LICENSE-2.0

2) 根据自定义行数展示

[user4@localhost ~]$ head -n 3 server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--Licensed to the Apache Software Foundation (ASF) under one or more

3) 按字节数展示

[user4@localhost ~]$ head -c 4 file1
java
[user4@localhost ~]$ head -c 2 file1
ja
[user4@localhost ~]$

查看信息并带行号
head setting.xml >> file7 && cat -n file7
head -c 文件含有中文时,三个字节表示一个汉字

6.1.6 阅读文件的结尾 和 循环查看新日志:tail

tail 命令从指定点开始将文件写到标准输出。使用 tail 命令的 -f 选项可以方便的查阅正在改变的日志文件,
tail -f filename 会把 filename 里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容。
命令格式:

tail [-参数] 文件名

命令功能:
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。

参数:
-f 循环读取
-c<数目> 显示的字节数
-n<行数> 显示行数
示例:

1) 默认读取文件尾部的10行数据

[user4@localhost ~]$ tail server.xml
​<!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
​<Context docBase="hn13_sys_am" path="/hn13_sys_am" reloadable="true" source="org.eclipse.jst.jee.server:hn13_sys_am"/></Host></Engine></Service>
</Server>

2) 从文件的第二行开始展示数据

[user4@localhost ~]$ tail -n +2 file1
hadoop
​
HTML
jQuery

3) 循环展示数据

[user4@localhost ~]$ tail -f file1
java
hadoop
​
HTML
jQuery


当输入tail -f 的时候当前客户端会进入等待状态,你将不能再输入命令(想输入必须按 ctrl+c 结束等待状态),这时程序会一直监听这个文件的变化,如果有变化马上就会显示到控制台

等待输入

其他客户端开始输入

多了一个hello
以后我们使用linux作为服务器的时候,可以利用这个特性进行服务器状态的监控(比如监控tomcat的日志)

6.1.7 更好的文本阅读工具:less

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。

可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
命令格式:

less [-参数] 文件

命令功能:
使用 less 可以随意浏览文件,而且 less 在查看之前不会加载整个文件。
参数:
-m 显示文件的百分比
-N 显示每行的行号

在文件内的操作命令:
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
j:向下滚动一行 ↑
k:向上滚动一行 ↓
G : 跳转到文件尾
g: 跳转到文件头
q:退出

示例:

1)浏览文件,并显示文件的百分比

[user4@localhost ~]$ less -m server.xml

2)浏览文件,并显示每行的行号

[user4@localhost ~]$ less -mN server.xml

3) 打开文件后,向下查询“server”字符串,按n键继续找,按N键反向找

/server

4) 打开文件后,向上查询“server”字符串

?server


history ,查看输入的历史命令
history | grep less,对输入命令的过滤

6.1.8 查找文件内容:grep

grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep 能将包含关键字所在的一行内容都输出出来,所以grep又叫行数据查询;

grep常用用法:

grep [-acinv] [--color=auto] '搜寻字符串' 文件名

选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数,如果同一行有相同的,则视为同一次数
-i :忽略大小写的不同,大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即 显示出没有 ‘搜寻字符串’ 内容的那一行!
-E : 按照正则表达式匹配查找

pattern正则表达式主要参数:

\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的行首。
$: 匹配正则表达式的行尾。

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

. :表示任意单个字符,如 a…b,a12b、aabb都可以。
* :表示有0个或多个 某个字符,如 ab*,a必须有,但b可以有0到多个;a*,a可以有0到多个,也就是所有。
示例:

1) 在server.xml中查询包含8080字样的行,并显示行号,并且查询包含 8080 8009 8843 这些行的数据

[user4@localhost ~]$ grep 8080 server.xml Define a non-SSL/TLS HTTP/1.1 Connector on port 8080<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>port="8080" protocol="HTTP/1.1"
[user4@localhost ~]$ grep -n 8080 server.xml
61:         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
63:    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
67:               port="8080" protocol="HTTP/1.1"
[user4@localhost ~]$ grep -En '8080|8443|8009' server.xml
61:         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
63:    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
67:               port="8080" protocol="HTTP/1.1"
69:               redirectPort="8443" />
71:    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
77:    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
82:    <!-- Define an AJP 1.3 Connector on port 8009 -->
83:    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>


准备文件

[user4@localhost ~]$ touch file2
[user4@localhost ~]$ echo 'hello java and HELLO JQUERY' >> file2
[user4@localhost ~]$ echo 'hello hadoop' >> file2
[user4@localhost ~]$ echo 'HELLO spark' >> file2
[user4@localhost ~]$ cat file2
hello java and HELLO JQUERY
hello hadoop
HELLO spark

2) 查询包含hello的行 然后不区分大小写再次查询包含hello的行 并统计出现了多少行

[user4@localhost ~]$ grep 'hello' file2
hello java and HELLO JQUERY
hello hadoop
[user4@localhost ~]$ grep -c 'hello' file2
2
[user4@localhost ~]$ grep -i 'hello' file2
hello java and HELLO JQUERY
hello hadoop
HELLO spark
[user4@localhost ~]$ grep -ci 'hello' file2
3
继续准备数据
[user4@localhost ~]$ echo 'yyyyMMdd and YYYY' >> file2
[user4@localhost ~]$ echo 'aaaa' >> file2
[user4@localhost ~]$ echo 'bbbb' >> file2
[user4@localhost ~]$ echo 'cccc' >> file2
[user4@localhost ~]$ cat file2
hello java and HELLO JQUERY
hello hadoop
HELLO spark
yyyyMMdd and YYYY
aaaa
bbbb
cccc

3) 显示不包含hello的行数 并且统计行数

[user4@localhost ~]$ grep -v 'hello' file2
HELLO spark
yyyyMMdd and YYYY
aaaa
bbbb
cccc
[user4@localhost ~]$ grep -vi 'hello' file2
yyyyMMdd and YYYY
aaaa
bbbb
cccc
[user4@localhost ~]$ grep -vic 'hello' file2
4

4) 匹配以 yyyy开头, 以 hadoop 结尾的行

[user4@localhost ~]$ grep '^yyyy' file2
yyyyMMdd and YYYY
[user4@localhost ~]$ grep 'hadoop$' file2
hello hadoop

5) 查询包含 c到f 区间字母的行

[user4@localhost ~]$ grep [c-f] file2
hello java and HELLO JQUERY
hello hadoop
yyyyMMdd and YYYY
cccc

6) 模糊匹配

a*把所有的都过滤出来,*代表0个或多个
-E a+,只把含有a的过滤出来,+代表1个或多个
[user4@localhost ~]$ grep a* file2
hello java and HELLO JQUERY
hello hadoop
HELLO spark
yyyyMMdd and YYYY
aaaa
bbbb
cccc

7) 特殊字符匹配

[user4@localhost ~]$ echo '赵*明' >> file2
[user4@localhost ~]$ grep '*' file2
赵*明
[user4@localhost ~]$ grep * file2
grep: link1: 是一个目录
[user4@localhost ~]$ grep \* file2
赵*明

6.1.9 文本分析工具:AWK

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

awk 和 grep一般都是放在一起使用的

grep负责查询数据,条件行的搜索

awk负责截取数据,一行数据,类似String的split方法

awk常用用法:

awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

选项参数说明:

-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 String msg = “IPADDR=“192.168.92.11”; String[] strs = msg.split(”=")

-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报告信息的版本。

基本用法
log1 文件内容如下

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

用法一:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

1) 每行按空格或TAB分割,输出文本中的1、4项

[user4@localhost ~]$ awk '{print $1,$4}' log1
2 a
3 like
This's
10 orange,apple,mongo

用法二 :

awk -F  #-F相当于内置变量FS, 指定分割字符

2) 使用 , 进行数据的获取

[user4@localhost ~]$ awk -F ',' '{print $1}' log1
2 this is a test
3 Are you like awk
This's a test
10 There are orange

3) 使用 空格 和 , 进行数据获取

[user4@localhost ~]$ awk -F '[ ,]' '{print $1}' log1
2
3
This's
10

4) 通过grep查询 然后获取想要的数据

[user4@localhost ~]$ cat /etc/passwd | grep user* | awk -F ':' '{print $1,$3,$4,$6,$7}'
user2 1001 1000 /home/user2 /bin/bash
user3 1002 1000 /home/user3 /bin/bash
user4 1003 1006 /home/user4 /bin/bash
user5 1004 1007 /home/user5 /bin/bash
sysuser1 997 995 /home/sysuser1 /bin/bash
nologinuser1 1005 1008 /userhome/user1 /sbin/nologin
nologinuser2 1006 1009 /userhome/user1 /sbin/nologin
nologinuser3 1007 1010 /userhome/user3 /sbin/nologin

5) 将想要的数据输出的文件中去

[user4@localhost ~]$ cat /etc/passwd | grep user* | awk -F ':' '{print $1,$3,$4,$6,$7}' >> ~/file2
[user4@localhost ~]$ cat file2
hello java and HELLO JQUERY
hello hadoop
HELLO spark
yyyyMMdd and YYYY
aaaa
bbbb
cccc
赵*明
user2 1001 1000 /home/user2 /bin/bash
user3 1002 1000 /home/user3 /bin/bash
user4 1003 1006 /home/user4 /bin/bash
user5 1004 1007 /home/user5 /bin/bash
sysuser1 997 995 /home/sysuser1 /bin/bash
nologinuser1 1005 1008 /userhome/user1 /sbin/nologin
nologinuser2 1006 1009 /userhome/user1 /sbin/nologin
nologinuser3 1007 1010 /userhome/user3 /sbin/nologin

思考题 : awk 怎么展示最后一列的数据呢?

{print $1,$NF} $1 第一列 $NF 最后一列cat /etc/passwd | grep -E 100+ | grep -v games |awk -F ':' '{print $1,$3,$6}'

6.2 文本编辑工具:SED

Linux sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明:

-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。

动作说明:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
例如 1,20s/old/new/g 就是啦!

6.2.1 实例

1) 在file1的第四行添加一行数据

(-e是先在内存中插入内容,可以cat查看,文件内容不会改变

-i是直接插入,非常危险,先使用e测试通过了再使用i插入文件)

[user4@localhost ~]$ cat file1
java
hadoop
​
HTML
jQuery
hello
[user4@localhost ~]$ sed -e 4a\hello,Sed file1
java
hadoop
​
HTML
hello,Sed
jQuery
hello
​

2) 以行为单位的新增/删除

将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!

[user4@localhost ~]$ nl passwd | sed '2,5d'1  root:x:0:0:root:/root:/bin/bash6  sync:x:5:0:sync:/sbin:/bin/sync7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8  halt:x:7:0:halt:/sbin:/sbin/halt.........省略


sed 的动作为 ‘2,5d’ ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 ‘’ 两个单引号括住喔!

3) 只要删除第 2 行

[user4@localhost ~]$ nl passwd | sed '2d'1  root:x:0:0:root:/root:/bin/bash3  daemon:x:2:2:daemon:/sbin:/sbin/nologin4  adm:x:3:4:adm:/var/adm:/sbin/nologin........其他的省略

4) 要删除第 3 到最后一行

[user4@localhost ~]$ nl passwd | sed '3,$d'1  root:x:0:0:root:/root:/bin/bash2  bin:x:1:1:bin:/bin:/sbin/nologin

在第二行后加上『赵文明』字样!

[user4@localhost ~]$ nl file1 | sed '2a 赵文明'1  java2  hadoop赵文明3  HTML4  jQuery5  hello


那如果是要在第二行前

[user4@localhost ~]$ nl file1 | sed '2i 赵文明'1  java
赵文明2  hadoop3  HTML4  jQuery5  hello

6.2.2 以行为单位的替换与显示

将第2-5行的内容取代成为『赵文明』呢?【2,5)

[user4@localhost ~]$ nl file1 | sed '2,5c 赵文明'1  java
赵文明5  hello

仅列出 passwd 文件内的第 5-7 行

[user4@localhost ~]$ nl passwd | sed -n '5,7p'5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6  sync:x:5:0:sync:/sbin:/bin/sync7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。

6.2.3 数据的搜寻并显示

搜索 /etc/passwd有 user 关键字的行

[user4@localhost ~]$ nl passwd | sed -n '/user/p'20  user2:x:1001:1000::/home/user2:/bin/bash21  user3:x:1002:1000::/home/user3:/bin/bash22  user4:x:1003:1006::/home/user4:/bin/bash23  user5:x:1004:1007::/home/user5:/bin/bash24  sysuser1:x:997:995::/home/sysuser1:/bin/bash25  nologinuser1:x:1005:1008:一个特殊的普通用户:/userhome/user1:/sbin/nologin26  nologinuser2:x:1006:1009:一个特殊的普通用户:/userhome/user1:/sbin/nologin27  nologinuser3:x:1007:1010:一个特殊的普通用户:/userhome/user3:/sbin/nologin
​

6.2.4 数据的搜寻并删除

删除/etc/passwd所有包含root的行,其他行输出(删除第1,10行)

[user4@localhost ~]$ nl passwd | sed '/root/d'2  bin:x:1:1:bin:/bin:/sbin/nologin3  daemon:x:2:2:daemon:/sbin:/sbin/nologin4  adm:x:3:4:adm:/var/adm:/sbin/nologin5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6  sync:x:5:0:sync:/sbin:/bin/sync7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8  halt:x:7:0:halt:/sbin:/sbin/halt9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin11  games:x:12:100:games:/usr/games:/sbin/nologin12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin13  nobody:x:99:99:Nobody:/:/sbin/nologin14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin15  dbus:x:81:81:System message bus:/:/sbin/nologin16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
​

6.2.5 数据的搜寻并执行命令

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bin替换为abc,再输出这行:

(如果要全部替换不使用q推出即可)

[user4@localhost ~]$ nl passwd | sed -n '/root/{s/bin/abc/;p;q}'20  user2:x:1001:1000::/home/user2:/abc/bash


结果:1 root❌0:0:root:/root:/abc/bash

最后的q是退出。

6.2.6 数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:

sed 's/要被取代的字串/新的字串/g'

(在file1中新增多个java字符串,之后替换成JAVA,
nl file1 | sed -n ‘/java/p’
nl file1 | sed -n ‘/java/{s/java/JAVA/g;p}’

搜集本机的IP地址

[user4@localhost ~]$ ip add >> file3
[user4@localhost ~]$ cat file3
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:a4:65:9b brd ff:ff:ff:ff:ff:ffinet 192.168.92.12/24 brd 192.168.92.255 scope global noprefixroute dynamic ens33valid_lft 1667sec preferred_lft 1667secinet6 fe80::793d:1ae8:736f:8885/64 scope link noprefixroute valid_lft forever preferred_lft forever

本机的ip是192.168.92.12 127.0.0.1 只保留这两个部分

(cat file3 | grep inet | grep -v inet6 | awk "{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲" | sed 's/\/.*//g’)

[user4@localhost ~]$ cat file3 | grep 'inet' | sed 's/^.*inet//g' | sed 's/\/.*$//g' | sed 's/^6.*//g'127.0.0.1
​192.168.92.12

多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为abc

[user4@localhost ~]$ nl passwd | sed -e '3,$d' -e 's/bin/abc/'1  root:x:0:0:root:/root:/abc/bash2  abc:x:1:1:bin:/bin:/sbin/nologin

-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bin替换为abc。

直接修改文件内容(危险动作)
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试!

将passwd文件中的 冒号 全部替换成 空格

[user4@localhost ~]$ sed -i 's/\:/&nbsp;/g' passwd

利用 sed 直接在 file1 最后一行加入 新年好

[user4@localhost ~]$ sed -i '$a hello,sed' passwd


由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增 新年好

sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!

6.3 文件查询命令 find 命令

Linux下find命令在目录结构中搜索文件,并执行指定的操作。
Linux下find 命令提供了相当多的查找条件,功能很强大。由于find 具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们 花时间来了解一下。
递归查询。

命令格式:

find 文件目录 [选项]

命令功能:
用于在文件树中查找文件,并作出相应的处理。用 . 来表示当前目录,用 / 来表示系统根目录 用~ 表示家目录。
命令选项:
-name 文件名 : 按照文件名查找文件。
-perm 权限 : 按照文件权限来查找文件。

-user UID或用户名 :按照文件属主来查找文件。
-group GID或组名 :按照文件所属的组来查找文件。

-type 类型 :查找某一类型的文件,诸如:

b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。

-newer 文件名:查找更新时间比文件新的文件。

-newer file1 ! -newer file2 查找更改时间比文件file1 新但没有比文件file2新的文件。

-mtime -n +n 按照文件的更改时间来查找文件

  • n 表示文件更改时间距现在n天以内,
    +n 表示文件更改时间距现在n天以前。

另外,下面三个的区别:

-amin n 查找系统中最后N分钟访问的文件
-atime n 查找系统中最后n*24小时访问的文件

-cmin n 查找系统中最后N分钟被改变文件状态的文件
-ctime n 查找系统中最后n*24小时被改变文件状态的文件

-mmin n 查找系统中最后N分钟被改变文件数据的文件
-mtime n 查找系统中最后n*24小时被改变文件数据的文件

案例 :

6.3.1 模糊查询案例

[user4@localhost ~]$ find /home/user4 -name 'f*'
/home/user4/file1
/home/user4/file2
[user4@localhost ~]$ find . -name 'f*'
./file1
./file2
[user4@localhost ~]$ find . -name '*t'
./.bash_logout
./.lesshst
[user4@localhost ~]$ find /home/user4 -name '*t'
/home/user4/.bash_logout
/home/user4/.lesshst

6.3.2 按文件所属的UID或者用户名查询

[user4@localhost ~]$ find . -user 1003
.
./.bash_logout
./.bash_profile
./.bashrc
./link1
./file1
./server.xml
./.lesshst
./file2
./log1
[user4@localhost ~]$ find /home/user4 -user 1003
/home/user4
/home/user4/.bash_logout
/home/user4/.bash_profile
/home/user4/.bashrc
/home/user4/link1
/home/user4/file1
/home/user4/server.xml
/home/user4/.lesshst
/home/user4/file2
/home/user4/log1
​
[user4@localhost ~]$ find /home/user4 -user user4
/home/user4
/home/user4/.bash_logout
/home/user4/.bash_profile
/home/user4/.bashrc
/home/user4/link1
/home/user4/file1
/home/user4/server.xml
/home/user4/.lesshst
/home/user4/file2
/home/user4/log1

6.3.3 按文件的类型查询

[user4@localhost ~]$ find . -type f
./.bash_logout
./.bash_profile
./.bashrc
./file1
./server.xml
./.lesshst
./file2
./log1
[user4@localhost ~]$ find . -type d
.
[user4@localhost ~]$ find . -type l
./link1

6.3.4 按文件新旧程度查询

[user4@localhost ~]$ find -newer file2 --> 查询比file2新的文件
.
./file4
[user4@localhost ~]$ find -newer server.xml ! -newer file2  --> 查询比server.xml新但是没有file2新的文件
./file1
./.lesshst
./file2
./log1
[user4@localhost ~]$ find -mmin +30 -mmin -60 查询距离现在一个小时之内并且是30分钟之前创建的文件
./log1

6.4 查找特定程序:whereis

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。

查找系统中可执行文件、man说明文件、源代码文件。

命令格式:

whereis [参数] 文件名

命令功能:
whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。whereis 程序还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。

参数:
-b 定位可执行文件。
-m 定位帮助文件。
-s 定位源代码文件。

示例:
1)找到程序的所有文件

whereis find

2)找到程序的所有可执行文件

whereis -b  find

6.5 查找可执行文件:which

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

命令格式:

which 可执行文件

命令功能:
which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
/etc/profile : 系统配置文件
linux启动时,会先加载系统配置,然后再加载用户个性化配置

如果你的用户登录系统后,不显示正常的家目录这些,可能是因为你的的家目录下的个性化配置丢失导致的, 从别的家目录拷贝过来。

示例:

[user4@localhost ~]$ which find
/bin/find


6.6 用户及版本信息查看

6.6.1 用户信息查看:who 和 whoami

who命令用于显示谁登录了系统(show who is logged on),who am i与之相同。另外一个叫whoami的命令,只输出用户账号。而who或者who am i不仅显示账号,还显示终端文件名、时间、来源IP等。
命令格式:

who
​
whoami

示例:

6.6.2 系统版本信息查看:uname

uname 命令用于显示系统当前版本信息。
命令格式:
uname -a #系统版本所有信息

uname -r #系统内核信息
示例:

6.7 寻求帮助:man

使用man 命令可以获取某个命令的帮助信息。man命令在显示手册页时是调用less程序,可以用less的控制命令进行上翻,下翻,查找等。
命令格式:

man 命令名


示例:
man find
man 命令里支持less 命令,可以用less 搜索高亮显示。

2019-8-20 [Linux] 6.Shell的基本操作 查看 改变 列出 阅读开头/结尾 循环查看 阅读工具less 查找文件内容 文本分析工具AWK 文本编辑工具SED文件find 帮助man相关推荐

  1. linux文本分析利器awk

    转 快速理解linux文本分析利器awk 原文链接 杜亦舒 性能与架构 awk是什么 如果工作中需要操作linux比较多,那么awk是非常值得学习的 awk是一个极其强大的文本分析工具,把文件逐行的读 ...

  2. Linux下Shell脚本实战之监测磁盘空间

    Linux下Shell脚本实战之监测磁盘空间 一.脚本目的及要求 二.脚本内容 三.运行脚本 一.脚本目的及要求 (1) 监控/home下每各个用户目录的占用磁盘大小 (2) 监控/var/log下前 ...

  3. linux实现shell,linux

    4.5M http://www.starbase-929.net/media/Calibre%20Library/Ken%20O.%20Bartch/Linux%20Shell%20Scription ...

  4. linux下变量名长度,Linux中shell的变量介绍

    Linux中shell的变量介绍 发布时间:2020-06-24 16:20:39 来源:亿速云 阅读:112 作者:元一 这期内容当中的小编将会给大家带来有关Linux中shell的变量介绍,以专业 ...

  5. 运维 - 第一阶段 - linux与shell编程

    linux与shell编程 讲师:墨竹 系统运维与linux 1.系统运维是什么 简单来说运维(Operation and maintenance)是指对公司硬件和软件的维护. 硬件包括:机房.机柜. ...

  6. linux shell程序设计实验报告,linux的shell脚本实验报告

    <linux的shell脚本实验报告>由会员分享,可在线阅读,更多相关<linux的shell脚本实验报告(7页珍藏版)>请在人人文库网上搜索. 1.第二次实验内容一.实验名称 ...

  7. Linux 下shell编程

    什么是shell?Shell是一个命令解析器,是介于Linux操作系统的内核(kernel)与用户之间的一个绝缘层.shell脚本就是讲各类命令预先放入其中,方便一次性执行的一个程序文件,主要用于方便 ...

  8. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

  9. Linux系统shell脚本之打印系统的IP信息

    Linux系统shell脚本基础之打印系统的IP信息 一.脚本要求 二.脚本内容 三.执行脚本 一.脚本要求 1.显示服务器的运行状态,并输出提示 2.输出电脑的IP地址等信息 3.将执行输出的信息记 ...

最新文章

  1. [Java基础]Scanner的使用(秋招在线笔试高频使用)版本:Java™ Platform Standard Ed. 8...
  2. 加速 cinder 删除volume速度
  3. mysql php 变量赋值,mysql变量赋值要注意的_MySQL
  4. replace into mysql去重_上传 phpexcel 类 入库并入库前去重
  5. Thinking in Java 源代码 source code 在IDEA上运行
  6. Java 线程多线程编程2---线程同步
  7. Python应用实战-用pandas实现数据预处理
  8. 邱勇校长在2018级研究生开学典礼上的讲话 | 融合成就人生新的高度
  9. 中台不火,天理难容!
  10. Osg/OsgEarth—— 无法打开文件osgGA/MatrixManipulator错误
  11. DWA泊车算法的实现
  12. SCP-bzoj-1000
  13. 实习踩坑之路:Date、LocalDate和LocalDateTime的区别
  14. python分词与去停用词简单实操
  15. 在VS中格式化代码 快捷键
  16. 【转】中华吸血鬼分析
  17. 【转】WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking的使用
  18. Java链表——插入和删除
  19. python opencv车辆测速视频汽车速度检测入侵检测测速
  20. Linux ls -l 各字段解释,硬链接软连接

热门文章

  1. 秒啊,Python代码可以轻松打包为可执行的程序
  2. Android开发之仿微信显示更多文字的View
  3. html轮播图添加文字,(swiper插件)轮播图,下面的文字随图片进行翻页
  4. 模仿微信群聊管理功能(头像管理效果)
  5. 红米10x和红米note8pro参数对比
  6. 如何把Dragonfly从一台电脑移到另外一台电脑
  7. android拷贝喜马拉雅节目到music目录
  8. 2013.12.05(5)——— android ViewPagerIndicator之SampleTabsDefault
  9. 7ZIP命令行极限压缩
  10. tornado创建项目后build vxworks报错unable to allocate heap, heap_chunk_size 587202560, Win32 error 0