上一章:第03章-linux常用命令
Vim编辑器
Vim编辑器是多模式编辑器,它是Vi的升级版本,它兼容Vi的所有指令,还有些新特性在里面,Vim具有代码补全,编译以及错误跳转等方便编程的丰富功能。我们对linux的各种服务进行配置的时候,实际上都是对各种配置文件的配置,一般服务器都是命令界面,所以掌握Vim编辑器是你开发路上的必备技能。
Vim是一款使用特别广泛的文本编辑器,使用过程中会涉及到3种模式:一般模式丶行末模式丶输入模式,每种模式又支持多种不同的命令快捷键,用户习惯后会觉得相当的顺手。如果你想熟悉的使用它,就必须熟练的掌握这3种模式的切换和快捷键使用。三种模式的切换方法见下图:
一般模式快捷键
光标移动快捷键:
快捷键 | 说明 |
光标移动到这一行最前面 | |
$ | 光标移动到这一行最后面 |
g | 光标移动到文件第一行 |
G | 光标移动到文件最后一行 |
数字+enter | 光标移动到数字所在行 |
内容操作快捷键:
快捷命令 | 说明 |
yy | 复制光标所在整行 |
3yy | 复制从光标处开始的后3行 |
p | p:粘贴到光标下一行 |
P | P:粘贴到光标上一行 |
u | 撤销 |
dd | 删除(剪切)光标所在行 |
3dd | 删除(剪切)从光标处开始的后3行 |
一般模式切换到输入模式快捷键
快捷命令 | 说明 |
i | 当前光标进入到输入模式 |
I | 当前光标移到所在行最前面进入输入模式 |
a | 当前光标下一个光标进入到输入模式 |
A | 当前光标移到所在行最后面进入输入模式 |
o | 当前光标移到下一行进入输入模式,注意会添加新行 |
O | 当前光标移到上一行进入输入模式,注意会添加新行 |
一般模式切换到行末模式快捷键
快捷命令 | 说明 |
:w | 保存 |
:q | 退出 |
:wq [文件名] | 保存且退出,若后面有文件名,则保存为指定文件名文件 |
:q! | 强制离开不保存 |
:wq! | 强制保存且退出 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:3 | 光标定位到第3行 |
:s/hello/world/g | 将整行的hello替换为world |
:%s/hello/world/g | 将整个文件的所有行的hello替换为world |
/hello | 查找hello字符串,从上到下查找,n向下找,N向上找 |
?hello | 查找hello字符串,从下到上查找,n向下找,N向上找 |
环境变量
什么是环境变量
环境变量是用来存储有关shell会话的信息以及通用的系统工作环境信息,可以把它看做一个通用的键值对系统配置文件信息加载到了内存,以便其它的程序或者shell能够方便的访问使用。默认情况下,系统会有一批默认的环境变量来定义系统环境。注意系统环境变量基本上都使用全大写字母。下表格列出些常用到的系统环境变量。
目录路径名称 | 说明 |
$HOME | 当前用户的主目录 |
$PATH | SHELL查找命令的目录列表 |
$LANG | SHELL的语言环境 |
$SHELL | 当前使用的SHELL解释器 |
$RANDOM | 生成一个随机数 |
$USER | 当前用户名称 |
全局环境变量和局部环境变量
全局环境变量就是对于shell的会话和子shell会话来说都是可以进行使用的。与之对应的局部环境变量只有本身创建的shell可以访问。全局变量定义:export 变量名称。
例1:局部变量只能在本身shell可以访问。
下面是test1.sh和test2.sh代码
[root@cdphost temp1]# sh test1.sh
test1 var1=hello
test2 var1=
说明:从上面输出结果可以看出test2.sh没有访问到test1.sh中的变量var1。
例2:全局变量可以在子shell访问。
下面是test1.sh和test2.sh代码
[root@cdphost temp1]# sh test1.sh
test1 var1=hello
test2 var1=hello
说明:从上面输出结果可以看出test2.sh可以访问到test1.sh中的变量var1。
删除环境变量
在shell中可以创建环境变量,当然我们也可以删除环境变量,使用关键字unset进行删除环境变量的操作,例如:unset 环境变量名称。
持久化环境变量
你已经知道了如何创建以及删除环境变量,那么接下来是如何持久的保存环境变量。
当你登录shell的时候,shell会从下面4个文件里面读取命令:
- /etc/profile
- /etc/bashrc
- $HOME/.bash_profile
- $HOME/.bashrc
/etc/profile和/etc/bashrc文件是系统环境文件,每个用户启动shell的时候会执行。
$HOME/.bash_profile和$HOME/.bashrc文件是每个用户独有的自己的环境文件,每个用户启动shell的时候会执行。对于全用户环境变量来说一般在/etc/profile中设置。对于用户自己的环境变量一般在$HOME/.bash_profile中设置
例1:设置全用户环境变量my_var1=hello。
[root@cdphost ~]# echo $my_var1
hello
[root@cdphost ~]# su - cdp
Last login: Mon Dec 26 23:35:40 CST 2022 on pts/1
[cdp@cdphost ~]$ echo $my_var1
hello
说明:通过上面可以看到root用户和cdp用户都可以访问环境变量 my_var1。
PATH环境变量
linux下的PATH环境变量和windows中的Path环境变量是一个作用,当你从命令行界面输入一个命令的时候,shell会从PATH所定义的目录查找命令和程序。所以它是你执行命令和程序的关键所在。PATH环境变量如下:
[root@cdphost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
说明:从上面环境变量的输出可以看出,目录之间使用冒号(:)进行分割。当你需要加入你安装的程序和工具的时候,一定记得要设置PATH环境变量。
用户管理
linux安全
用户是所有系统安全的核心,linux系统为每一个用户分配唯一的UID,但是登录系统的时候我们用的是登录名,同时也会关联一个对应的密码。Linux系统会用特定的文件和工具跟踪和管理系统的用户账户。
/etc/passwd文件
Linux系统有一个专门的文件保存登录用户的基本信息,这个文件就是/etc/passwd。该文件是一个标准的文本文件,你可以用任何文本编辑器打开进行手动管理操作,但是不建议这样操作,因为如果不小心破坏了它,有可能导致用户无法正常登录。下面是/etc/passwd的基本例子:
[root@cdphost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
/etc/passwd的字段信息如下:
- 登录用户名
- 用户密码
- 用户账户的UID(数字形式)
- 用户账户的组ID(GID)(数字形式)
- 用户账户的文本描述(称为备注字段)
- 用户HOME目录的位置
- 用户的默认shell
/etc/passwd文件种的密码都是x,并不是所有用户密码都是一样的。是因为早期系统密码都加密记录在/etc/passwd。这样不安全,会导致很多不良用心的人暴力破解密码。基于这个考虑,后面改为将密码保留在单独的一个文件种/etc/shadow。
添加用户(useradd)
useradd常用命令参数:
-d home_dir 指定用户登入时的起始目录
-g 指定用户所属的群组
-G 指定用户所属的附加群组。
-m 自动创建用户的HOME目录
-s shell 指定默认的登录shell
-u uid 为账户指定唯一的UID
例1:新建用户user001且自动创建home目录。
[root@cdphost ~]# useradd -m user001
删除用户(userdel)
n userdel常用命令参数:
-r 删除home目录。
例子1:删除用户user001。
[root@cdphost home]# userdel -r user001
修改用户密码(passwd)
语法:passwd 用户名。
例1:修改user001登录密码。
[root@cdphost home]# passwd user001
Changing password for user user001.
New password:
批量修改用户密码
批量修改用户密码:
[root@cdphost home]# echo "3" | passwd --stdin user001
Changing password for user user001.
passwd: all authentication tokens updated successfully.
用户组管理
/etc/group文件
/etc/group文件是用户组文件。
查看/etc/group文件:
[root@cdphost home]# cat /etc/group | tail -n 5
tcpdump:x:72:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
cdp:x:1000:cdp
输出的字段信息如下:
- 组名
- 组密码
- GID
- 属于该组的用户列表
添加用户组(groupadd)
语法:groupadd -g 组id 组名称。
例1:新建组id为1050,组名为gp001的组。
[root@cdphost home]# groupadd -g 1050 gp001
[root@cdphost home]# cat /etc/group | grep gp001
gp001:x:1050:
删除用户组(groupdel)
语法:groupdel 组名称
例1:删除用户组gp001。
[root@cdphost home]# cat /etc/group | grep gp001
gp001:x:1050:
[root@cdphost home]# groupdel gp001
[root@cdphost home]# cat /etc/group | grep gp001
[root@cdphost home]#
文件权限
认识文件权限
查看文件详细信息如下:
上图输出的结果红框内容分为4段:
第1段:1个字符代表了对象类型:
- - 代表目录
- d 代表目录
- l 代表链接
- c 代表字符型设备
- b 代表块设备
- n 代表网络设备
第2段到第4段每3个字符为一组,分别代表了:
- 对象的属主权限
- 对象的属组权限
- 系统其他用户权限
具体文件权限查看下图:
权限二进制和八进制表现形式如下:
权限 | 二进制 |
--- | 000 |
--x | 001 |
-w- | 010 |
-wx | 011 |
r-- | 100 |
r-x | 101 |
rw- | 110 |
rwx | 111 |
默认文件权限(umask)
我们创建文件的时候,会默认给个权限,那么这个权限从哪里来呢,答案就是umask。umask用来设置文件和目录的默认权限。umask通常设置在文件/ect/profile中。
umask值只是个掩码。它会屏蔽掉不想授予该安全级别的权限。文件和文件夹的默认权限等于对象的全权限减去umask值。文件的全权限值是666(所有用户都有读写权限),文件夹的全权限值是777(所有用户都有读写执行权限)。
Linux中的umask值如下:
root用户创建文件默认权限计算如下:
-- | 默认权限 |
文件默认权限 | 666-022=644 à rw-r--r-- |
文件夹默认权限 | 777-022=755 à rwxr-xr-x |
修改文件权限(chmod)
chmod命令用来改变文件和目录的安全性设置。通常可以用八进制和符号模式进行修改文件权限。
八进制模式:chmod 777 newfile.txt
符号模式:chmod [ugoa] [+-] [rwx]
- u 代表用户
- g 代表组
- o 代表其他
- a 代表上述所有
例1:创建newfile.txt文件且设置权限为777。
[root@cdphost temp2]# touch newfile.txt
[root@cdphost temp2]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 14 17:01 newfile.txt
[root@cdphost temp2]# chmod 777 newfile.txt
[root@cdphost temp2]# ll
total 0
-rwxrwxrwx 1 root root 0 Aug 14 17:01 newfile.txt
例2:newfile.txt文件所属用户去掉读权限,所属组去掉写权限,其它用户去掉执行权限。
[root@cdphost temp2]# ll
total 0
-rwxrwxrwx 1 root root 0 Aug 14 17:01 newfile.txt
[root@cdphost temp2]# chmod u-r newfile.txt
[root@cdphost temp2]# chmod g-w newfile.txt
[root@cdphost temp2]# chmod o-x newfile.txt
[root@cdphost temp2]# ll
total 0
--wxr-xrw- 1 root root 0 Aug 14 17:01 newfile.txt
例3:newfile.txt文件所属用户加上读权限,所属组加上写权限,其它用户加上执行权限。
[root@cdphost temp2]# ll
total 0
--wxr-xrw- 1 root root 0 Aug 14 17:01 newfile.txt
[root@cdphost temp2]# chmod u+r newfile.txt
[root@cdphost temp2]# chmod g+w newfile.txt
[root@cdphost temp2]# chmod o+x newfile.txt
[root@cdphost temp2]# ll
total 0
-rwxrwxrwx 1 root root 0 Aug 14 17:01 newfile.txt
例4:newfile.txt去掉文件所属用户,所属组,其它用户的执行权限。
[root@cdphost temp2]# ll
total 0
-rwxrwxrwx 1 root root 0 Aug 14 17:01 newfile.txt
[root@cdphost temp2]# chmod a-x newfile.txt
[root@cdphost temp2]# ll
total 0
-rw-rw-rw- 1 root root 0 Aug 14 17:01 newfile.txt
改变文件所属关系(chown)
chown命令改变文件的所有者或者所有组。
例1:改变文件ccc.txt的文件所有者为cdp用户。
[root@cdphost ~]# ll ccc.txt
-rw-r--r-- 1 root root 0 Sep 10 14:03 ccc.txt
[root@cdphost ~]# chown cdp ccc.txt
[root@cdphost ~]# ll ccc.txt
-rw-r--r-- 1 cdp root 0 Sep 10 14:03 ccc.txt
例2:改变文件ccc.txt的文件所有者为cdp用户,所属组为cdp组。
[root@cdphost ~]# ll ccc.txt
-rw-r--r-- 1 root root 0 Sep 10 14:03 ccc.txt
[root@cdphost ~]# chown cdp:cdp ccc.txt
[root@cdphost ~]# ll ccc.txt
-rw-r--r-- 1 cdp cdp 0 Sep 10 14:03 ccc.txt
例3:改变目录ccc及其子孙所有文件的所有者为cdp用户,所属组为cdp组。
[root@cdphost ~]# ll | grep ccc
drwxr-xr-x 2 root root 6 Sep 10 14:12 ccc
[root@cdphost ~]# chown -R cdp:cdp ccc
[root@cdphost ~]# ll | grep ccc
drwxr-xr-x 2 cdp cdp 6 Sep 10 14:12 ccc
输入输出重定向
linux命令运行时会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,从stdin读取数据。
标准输出文件(stdout):stdout的文件描述符为1,向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,向stderr写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
重定向命令如下:
命令 | 说明 |
command > file | 将输出重定向到 file |
command >> file | 将输出以追加的方式重定向到 file |
command < file | 将输入重定向到 file |
Here Document
Here Document 是一种特殊的重定向方式,将输入重定向到一个交互式 Shell 脚本或程序。
语法:
command << delimiter
document
delimiter
注意:第二个分割串delimiter必须顶格写,前后均不可有空格或者tab
/dev/null 文件
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果
执行命令,不想在屏幕上输出结果:
command > /dev/null
执行命令,不想在屏幕上输出结果,错误信息也屏蔽:
command > /dev/null 2>&1
说明:
0 是标准输入,1 是标准输出,2 是标准错误输出。
2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。
例1:输出重定向
[root@cdphost Desktop]# echo "hello" > file.txt
[root@cdphost Desktop]# cat file.txt
hello
[root@cdphost Desktop]# echo "world" > file.txt
[root@cdphost Desktop]# cat file.txt
world
例2:输出重定向(追加)
[root@cdphost Desktop]# echo "hello" > file.txt
[root@cdphost Desktop]# cat file.txt
hello
[root@cdphost Desktop]# echo "world" >> file.txt
[root@cdphost Desktop]# cat file.txt
hello
world
例3:输入重定向
[root@cdphost Desktop]# cat << eof
> hello
> world
> cdp
> eof
hello
world
cdp
[root@cdphost Desktop]#
sed和awk
在我们日常开发中,sed更多的是基于行来处理,而awk更多的是基于列来处理。
sed
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
sed编辑器会执行操作如下:
1. 一次从输入中读取一行数据。
2. 根据编辑器命令匹配数据。
3. 根据命令修改流中的数据。
4. 将更改后的数据输出到STDOUT。
重点:sed编辑器不会修改文本文件的数据,它只会将修改后的数据发送到STDOUT,如果你查看原来的文本文件,它仍然保留着原始数据。
sed语法:sed [选项] [-e<script命令>] [-f<script文件>] [文本文件]
选项说明:
选项 | 说明 |
-e script | 处理输入时,将script中指定的命令添加到已有的命令中 |
-f file | 处理输入时,将file中指定的命令添加到已有的命令中 |
-n | 仅显示script处理后的结果 |
-i | 表示直接修改文件内容,请不要随便用到系统配置文件 |
script动作说明:
选项 | 说明 |
s | 替换:替换文本 |
p | 打印:打印匹配到的数据,通常和-n选项联合使用 |
a | 新增:a后面的字符串做为新行字符,指定行下一行 |
d | 删除:删除指定行 |
i | 插入:i后面的字符串做为新行字符,指定行上一行 |
例子1:通过管道符输入sed编辑器处理,将word替换为test
[root@localhost Desktop]# echo "hello word" | sed 's/word/test/'
hello test
例子2:使用sed编辑器处理文件,将文件中的word替换为test,输出到屏幕
[root@localhost Desktop]# cat data.txt
hello word
hello word
hello word
hello word
hello word
hello word
hello word
[root@localhost Desktop]# sed 's/word/test/' data.txt
hello test
hello test
hello test
hello test
hello test
hello test
hello test
例子3:使用sed编辑器处理文件,将文件中的word替换为test,hello替换为hehe输出到屏幕
[root@localhost Desktop]# cat data.txt
hello word
hello word
hello word
hello word
hello word
hello word
hello word
[root@localhost Desktop]# sed -e 's/word/test/;s/hello/hehe/' data.txt
hehe test
hehe test
hehe test
hehe test
hehe test
hehe test
hehe test
例子4:使用sed编辑器处理文件,从文件中读取编辑器命令
[root@localhost Desktop]# cat data.sed
s/word/test/
s/hello/hehe/
[root@localhost Desktop]# cat data.txt
hello word
hello word
hello word
hello word
hello word
hello word
hello word
[root@localhost Desktop]# sed -f data.sed data.txt
hehe test
hehe test
hehe test
hehe test
hehe test
hehe test
hehe test
例5:替换行中所有word为test
[root@localhost Desktop]# echo "hello word word" | sed 's/word/test/'
hello test word
[root@localhost Desktop]# echo "hello word word" | sed 's/word/test/g'
hello test test
例6:打印匹配的数据行
[root@localhost Desktop]# cat data.txt
hello word
hello word
hello word
helslo woris
[root@localhost Desktop]# sed -n 's/word/test/p' data.txt
hello test
hello test
hello test
例7:文件的第3行新增一行,该行字符串为hhhh
[root@localhost Desktop]# cat data.txt
hello word
hello word
hello word
helslo woris
[root@localhost Desktop]# sed '3a hhhh' data.txt
hello word
hello word
hello word
hhhh
helslo woris
例8:删除1到3行,删除3到最后一行
[root@localhost Desktop]# cat data.txt
hello word
hello word
hello word
helslo woris
[root@localhost Desktop]# sed '1,3d' data.txt
helslo woris
[root@localhost Desktop]# sed '3,$d' data.txt
hello word
hello word
例9:文件的第3行新增一行,改行位于上一行,该行字符串为hhhh
[root@localhost Desktop]# cat data.txt
hello word
hello word
hello word
helslo woris
[root@localhost Desktop]# sed '3i hhhh' data.txt
hello word
hello word
hhhh
hello word
helslo woris
例10:删除第1行
[root@localhost Desktop]# cat data.txt
hello word
asfsdsfhello word
hello word
helslo woris
[root@localhost Desktop]# sed -i '1d' data.txt
[root@localhost Desktop]# cat data.txt
asfsdsfhello word
hello word
helslo woris
例子11:最后一行新增test字符
[root@localhost Desktop]# cat data.txt
asfsdsfhello word
hello word
helslo woris
[root@localhost Desktop]# sed -i '$a test' data.txt
[root@localhost Desktop]# cat data.txt
asfsdsfhello word
hello word
helslo woris
test
例子12:第一行新增first line字符
[root@localhost Desktop]# cat data.txt
asfsdsfhello word
hello word
helslo woris
test
[root@localhost Desktop]# sed -i '1i first line' data.txt
[root@localhost Desktop]# cat data.txt
first line
asfsdsfhello word
hello word
helslo woris
test
例13:替换一行中的多处需要替换的字符
[root@localhost Desktop]# cat data.txt
first line
asfsdsfhello word word word
hello word hhh word
helslo woris word word
test word word
[root@localhost Desktop]# sed 's/word/test/' data.txt
first line
asfsdsfhello test word word
hello test hhh word
helslo woris test word
test test word
[root@localhost Desktop]# sed 's/word/test/g' data.txt
first line
asfsdsfhello test test test
hello test hhh test
helslo woris test test
test test test
awk
awk编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
awk最大的特点是提取格式化的数据文件中的数据,分隔为单个元素,然后你又可以进行格式化输出,awk工具在日常开发中使用相当频繁。
举个简单的例子:你ls –l列出一个目录的文件信息,然后拷贝文件名。
[root@localhost Desktop]# ls -l | grep -v total | awk '{print $9}'
1.sh
2
2.sh
data.sed
data.txt
file1.txt
file.txt
temp1.txt
test001.sh
test002.sh
test003.sh
test004.sh
test005.sh
test006.sh
test007.sh
awk语法:awk [选项] [script] [文本文件]。
选项说明:
选项 | 说明 |
-F | 指定按照什么分隔符进行分列改行元素 |
-f scriptfile | 按指定的脚本文件中的命令处理文件 |
默认情况下:awk是以空白符号(空格和制表符)来分隔一行字符的。
- $0代表整个文本行
- $1代表文本行第1个数据元素
- $2代表文本行第2个数据元素
- $3代表文本行第3个数据元素
- $n代表文本行第n个数据元素
注意:当你使用脚本命令的时候必须用花括号{}包裹命令
例1:读取文本文件显示第1个字段值
[root@localhost Desktop]# cat data.txt
first line
asfsdsfhello word word word
hello word hhh word
helslo woris word word
test word word
[root@localhost Desktop]# awk '{print $1}' data.txt
first
asfsdsfhello
hello
helslo
test
例2:打印所有系统用户
[root@localhost Desktop]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
…
例3:改变指定列的值,然后打印
[root@localhost Desktop]# cat data.txt
a a a a a
b b b b b
c c c c c
d d d d d
[root@localhost Desktop]# awk '{$5="f";print $0}' data.txt
a a a a f
b b b b f
c c c c f
d d d d f
例4:打印所有用户的home目录
[root@localhost Desktop]# cat data.awk
{
text="'s home directory is'"
print $1 text $6
}
[root@localhost Desktop]# awk -F: -f data.awk /etc/passwd
root's home directory is'/root
bin's home directory is'/bin
daemon's home directory is'/sbin
adm's home directory is'/var/adm
lp's home directory is'/var/spool/lpd
我们有时候会在处理文件前运行脚本,或者在处理文件后运行脚本,这时候需要用到BEGIN和END关键字。
例1:使用BEGIN和END
[root@localhost Desktop]# cat data.txt
a a a a a
b b b b b
c c c c c
d d d d d
[root@localhost Desktop]# awk 'BEGIN {print "start file"} {print $0} END {print "end file"} ' data.txt
start file
a a a a a
b b b b b
c c c c c
d d d d d
end file
awk内置变量使用方法:
变量说明:
变量 | 说明 |
FS | 输入字段分隔符,默认是空格 |
RS | 输入记录分隔符,默认换行符 |
OFS | 输出字段分隔符,默认是空格 |
ORS | 输出记录分隔符,默认换行符 |
FIELDWIDTHS | 由空格分隔的一列数字,定义了每个数据字段的确切宽度 |
例子1:使用FS和OFS
[root@localhost Desktop]# cat data.txt
a,a,a,a,a
b,b,b,b,b
c,c,c,c,c
d,d,d,d,d
[root@localhost Desktop]# awk 'BEGIN {FS=",";OFS="-"} {print $1,$2,$3}' data.txt
a-a-a
b-b-b
c-c-c
d-d-d
例子2:FS和RS的使用
[root@localhost Desktop]# cat data.txt
zhangsan
shuxue 100
yuwen 90
age 15
lisi
shuxue 80
yuwen 95
age 14
wangwu
shuxue 95
yuwen 80
age 16
[root@localhost Desktop]# awk 'BEGIN {FS="\n";RS=""} {print $1,$4}' data.txt
zhangsan age 15
lisi age 14
wangwu age 16