天天看点

第04章-vim编辑器-环境变量-用户文件权限-sed与awk

作者:湖南小陈dy

上一章:第03章-linux常用命令

Vim编辑器

Vim编辑器是多模式编辑器,它是Vi的升级版本,它兼容Vi的所有指令,还有些新特性在里面,Vim具有代码补全,编译以及错误跳转等方便编程的丰富功能。我们对linux的各种服务进行配置的时候,实际上都是对各种配置文件的配置,一般服务器都是命令界面,所以掌握Vim编辑器是你开发路上的必备技能。

Vim是一款使用特别广泛的文本编辑器,使用过程中会涉及到3种模式:一般模式丶行末模式丶输入模式,每种模式又支持多种不同的命令快捷键,用户习惯后会觉得相当的顺手。如果你想熟悉的使用它,就必须熟练的掌握这3种模式的切换和快捷键使用。三种模式的切换方法见下图:

第04章-vim编辑器-环境变量-用户文件权限-sed与awk

一般模式快捷键

光标移动快捷键:

快捷键 说明
光标移动到这一行最前面
$ 光标移动到这一行最后面
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代码

第04章-vim编辑器-环境变量-用户文件权限-sed与awk
第04章-vim编辑器-环境变量-用户文件权限-sed与awk
[root@cdphost temp1]# sh test1.sh
test1 var1=hello
test2 var1=           

说明:从上面输出结果可以看出test2.sh没有访问到test1.sh中的变量var1。

例2:全局变量可以在子shell访问。

下面是test1.sh和test2.sh代码

第04章-vim编辑器-环境变量-用户文件权限-sed与awk
第04章-vim编辑器-环境变量-用户文件权限-sed与awk
[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。

第04章-vim编辑器-环境变量-用户文件权限-sed与awk
[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]#           

文件权限

认识文件权限

查看文件详细信息如下:

第04章-vim编辑器-环境变量-用户文件权限-sed与awk

上图输出的结果红框内容分为4段:

第1段:1个字符代表了对象类型:

  • - 代表目录
  • d 代表目录
  • l 代表链接
  • c 代表字符型设备
  • b 代表块设备
  • n 代表网络设备

第2段到第4段每3个字符为一组,分别代表了:

  • 对象的属主权限
  • 对象的属组权限
  • 系统其他用户权限

具体文件权限查看下图:

第04章-vim编辑器-环境变量-用户文件权限-sed与awk

权限二进制和八进制表现形式如下:

权限 二进制
--- 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值如下:

第04章-vim编辑器-环境变量-用户文件权限-sed与awk

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