linux awk命令--如何引入外部变量

linux awk命令--如何引入外部变量,第1张

用shell命令删除目录下文件,但是排除某些特殊文件,第一时间无脑从谷歌获取。

丢到脚本执行发现,并没有删除,原来rm后面命令返回结果有问题,必须事当前目录才行,脚本脱离当前目录就懵逼。那想办法改吧。

既然 ls txt | grep -v testtxt 返回的的是文件名称,那拼上目录就完事了。
使用awk拼接目录和文件:

由于ls -l 返回的第一行total 272需过滤:

过滤第一行统计信息:

awk内置了一些变量可以拼接,还有常量也可以拼接,此处不表,重点提及awk作用域外的变量引用,有一下三种方式:

格式如:awk ‘{action}’ 变量名=变量值 ,这样传入变量,可以在action中获得值。 注意:变量名与值放到’{action}’后面。
这种变量在:BEGIN的action不能获得。

格式如:awk –v 变量名=变量值 [–v 变量2=值2 …] 'BEGIN{action}’ 注意:用-v 传入变量可以在3中类型的action 中都可以获得到,但顺序在 action前面。

只需要调用:awk内置变量 ENVIRON,就可以直接获得环境变量。它是一个字典数组。环境变量名 就是它的键值。

初始化按照初始化表中的值的顺序依次给数组每个元素赋值。因此,a0赋值为10,a[1]赋值为表达式(a[9]=5)的结果。赋值号的返回值为左值的引用,因此先将a[9]赋值为5,然后返回a[9]的引用对a[1]赋值,因此a[1]=a[9]=5。a[2]~a[8]处于未赋值状态。

直接赋值给变量就可以了啊,变量可以保存多行字符串内容的。使用变量的时候记得将其放在双引号里就行了。

var=`dmesg | grep eth`
echo "$var"

一对反引号(ESC下面的键),表示优先执行其中的命令,执行完成后将结果赋值给var变量。

字符串变量使用的时候加双引号,作为一个整体看待。

Linux中的read命令从标准输入中读取一行,并把输入行的每个字段的值指定给shell变量。
语法:
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p
prompt] [-t timeout] [-u fd] [name ]
参数:
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分隔符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以使用命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话\就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
说明
read内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有三个不同的版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是awk的GNU版本。
之所以叫awk是因为其取了三位创始人Alfred Aho,Peter Weinberger,和Brian Kernighan的Family Name的首字符。
awk格式:
格式: sed -n '3p' sedtxt
找谁干啥(条件动作)
awk格式
#取出/etc/passwd 第1行的第1列和第3列
awk -F: 'NR==1{print $1$3}' /etc/passwd
awk 选项 '条件{动作}' /etc/passwd
条件: 哪一行,过滤什么内容
动作: print输出与显示 ,计算
awk取行:与sed类似
案例01:取出sedtxt的第2行
[root@oldboy81-golden-lnb /oldboy]# cat sedtxt
101oldgirl,CEO
102zhangya,CTO
103lidao007COO
104yy,CFO
105feixue,CIO
110lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# awk 'NR==2' sedtxt
102zhangya,CTO
#awk '行号 等于 2' sedtxt
#NR awk内置变量
Number of Record 记录号(行号)
案例02:取出sedtxt中包含oldboy或lidao的行
[root@oldboy81-golden-lnb /oldboy]# sed -rn '/oldboy|lidao/p' sedtxt
103lidao007COO
110lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# awk '/oldboy|lidao/' sedtxt
103lidao007COO
110lidao,COCO
案例03:取出文件第2行到第5行内容
#awk '行号大于等于2 并且 行号小于等于5' sedtxt
#方法01
awk 'NR>=2 && NR<=5' sedtxt #必会
&& 表示并且
#方法02
sed -n '25p' sedtxt
#方法03 了解
awk 'NR==2NR==5' sedtxt #从行号是2的行开始 到 行号是5的行结束( 了解)
案例04:取出文件第3行到最后一行内容
[root@oldboy81-golden-lnb /oldboy]# awk 'NR >= 3' sedtxt
103lidao007COO
104yy,CFO
105feixue,CIO
110lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# sed -n '3$p' sedtxt
103lidao007COO
104yy,CFO
105feixue,CIO
110lidao,COCO
案例05:取出从包含oldboy的行到lidao的行
[root@oldboy81-golden-lnb /oldboy]# cat sedtxt
101oldgirl,CEO
102zhangya,CTO
103lidao007COO
104yy,CFO
105feixue,CIO
110lidao,COCO
root@oldboy81-golden-lnb /oldboy]# sed -n '/old/,/lidao/p' sedtxt
101oldgirl,CEO
102zhangya,CTO
103lidao007COO
[root@oldboy81-golden-lnb /oldboy]# awk '/old/ , /lidao/' sedtxt
101oldgirl,CEO
102zhangya,CTO
103lidao007COO

显示所有的环境变量,如果你想获取某个变量的详细信息,使用 echo $VARIABLE_NAME

Example:

whereis使用系统自动构建的数据库来搜索可执行文件,源文件和手册页面。

Example:

它在环境变量PATH指定的目录中搜索可执行文件。此命令将打印可执行文件的完整路径。

Example:

清除窗口上的内容。

列出您的文件。 ls 有很多选项: -l 列出“长格式”的文件,其中包含文件的确切大小,拥有该文件的人员,有权查看该文件,以及何时进行上次修改。 -a 列出所有文件,包括隐藏文件。有关此命令的更多信息,请检查此链接。

Example:

创建或更新您的文件。

Example:

它可以在UNIX或Linux下用于以下目的。

显示文件的第一部分(用空格移动并键入q以退出)。

输出文件的前10行。

输出最后10行文件。用于-f在文件增长时输出附加数据。

将文件从一个位置移动到另一个位置。

filename1 文件的源路径, filename2 是目标路径。

将文件从一个位置复制到另一个位置。

filename1 文件的源路径, filename2 是目标路径。

删除文件。在目录上使用此命令会给您显示一个错误: rm: directory: is a directory 。 为了删除目录,你必须传递 -rf 去递归删除目录中的所有内容。

比较文件,并列出他们的差异。

让您更改文件的读取,写入和执行权限。

压缩文件。

解压缩gzip压缩的文件。

让你查看gzip压缩文件,而不需要gunzip它。

打印文件。

查看打印机队列。

Example:

从打印队列移除某些内容。

awk是处理文本文件最有用的命令。它一行一行地在整个文件上运行。默认情况下,它使用空格分隔字段。awk命令最常用的语法是

让我们采取以下文件 /etc/passwd 。以下是此文件包含的示例数据:

所以现在让我们从这个文件只获取用户名。 -F 指定在我们要基于哪个分隔字段。在我们的例子中 : 。 { print $1 } 意味着打印出第一个匹配字段。

运行上述命令后,您将获得以下输出。

有关如何使用 awk 的更多细节,请查看以下链接。

查找文件内的文本。您可以使用grep搜索与一个或多个正则表达式匹配的文本行,并仅输出匹配的行。

Example:

您还可以通过使用 -i 选项强制grep忽略单词大小写。 -r 可用于搜索指定目录下的所有文件,例如:

-w 只搜索单词。有关 grep 详细信息,请查看以下链接。

告诉你一个文件中有多少行,多少单词和多少字符。

Example:

7459 是行数, 15915 是单词数, 398400 是字符数

用于过滤和转换文本的流编辑器。

exampletxt

用连字符替换所有空格

使用"d"替换所有的数字

排序文本文件的行

exampletxt

sort exampletxt

随机化一个排序的exampletxt

报告或省略重复的行

exampletxt

只显示exampletxt的唯一行(首先你需要排序,否则看不到重叠)

显示每行的唯一项,并告诉我找到了多少个实例

从每行文件中删除部分。

exampletxt

显示第2,7和9栏的空格作为分隔符

显示一行文字

显示 "Hello World"

用字母之间的换行显示 "Hello World"

简单的最佳文本格式化程序

example: exampletxt (1 line)

将exampletxt的行输出为20个字符的宽度

翻译或删除字符

exampletxt

把所有小写字母变成为大写

把所有的空格变成换行符

显示文件的行数

exampletxt

带行号显示 exampletxt

打印匹配模式的行 - 扩展表达式(别名为:'grep -E')

exampletxt

在其中显示“Lorem”或“dolor”的行

打印匹配模式到的行 - FIXED模式匹配(别名为:'grep -F')
exampletxt

在exampletxt中找到具体的字符串'(Lorem | doloar)'

生成一个新的目录。

执行这个,从一个目录转移到另外一个目录。

将你移动到主目录。此命令接受可选的 dirname ,将你移动到该目录。

告诉你你目前所在的目录。

ssh (SSH client) 是一个用来在登录到远程机器并执行的命令的程序。

此命令还接受 -p 可用于连接到特定端口的选项。

返回当前登录用户名。

允许当前登录的用户更改其密码。

显示您的磁盘配额。

显示当前日期和时间。

显示月份的日历。

显示当前的正常运行时间。

显示谁在线

Displays information about user

显示内核信息。

显示指定命令的手册。

显示磁盘使用情况。

显示文件名中文件和目录的磁盘使用情况(du -s只给出一个总数)。

列出您最后登录的指定用户。

列出您的进程。

使用您所提供的ID杀死(结束)进程。

用名称杀死所有进程。

显示当前活动的进程。

列出停止的或后台工作的Job; 恢复在后台停止的Job。

前台化最近的Job。
Brings the most recent job in the foreground

Pings主机并输出结果。

获取域的whois信息。

获取域的DNS信息。

下载文件。

在本地主机和远程主机之间或两台远程主机之间传输文件。

从本地主机复制到远程主机

从远程主机复制到本地主机

此命令还接受 -P 选项可用于连接到特定的端口。

在bash中你将编写第一行脚本文件,被叫做 shebang 。任何脚本中的这一行来确定脚本的执行能力,如独立的可执行文件,而不是在终端中预先键入sh,bash,python,php等。

Example:

上面的一行创建一个变量str并给它赋值“hello world”。通过 $ 放在变量名的开头来检索变量的值。

Example:

像其他语言一样,bash也有数组。数组是包含多个值的变量。数组的大小没有最大限制。bash中的数组为零。第一个元素被索引为元素0在bash中创建数组有几种方法。以下给出了哪些。

Examples:

要在特定索引处显示值,请使用以下语法:

如果没有提供索引,则假定为数组元素0。要了解数组中有多少值,请使用以下语法:

Bash也支持三元条件。下面是一些例子。

检查一些关于如何 *** 作字符串的语法

Example:

当您运行上述示例时,该hello函数将输出“world!”。上述两个功能 hello 和 say 是相同的。主要区别是功能 say 。此功能打印其接收到的第一个参数。函数内的参数以与给脚本的参数相同的方式进行处理。

bash中的条件语句与其他编程语言相似。条件有许多形式,如最基本的形式是 if 表达式 then 语句,其中语句只有在表达式为真时执行。

有时,如果条件变得混乱,所以你可以使用相同的条件 case statements 。

Expression Examples:

bash 中有三种不同类型的循环。 for , while 和 until

for 语法:

while 语法:

until 语法:

bash_profile 可以通过运行后面的命令打开。 nano ~/bash_profile

nano ~/bashrc

source ~/bashrc
cd hotellogs

您可以通过传递不同的选项来轻松地调试bash脚本bash。例如-n,不会运行命令并仅检查语法错误。-vecho命令在运行它们之前。-x命令行处理后的echo命令。

如果多个内容是与关系,可以多个grep用管道相连,是或关系,可用正则式
如grep '\(ab|cd\)' atxt 是查包含 ab或cd的行, grep 'ab' atxt | grep 'cd' 是查包含ab和cd的行
要将结果赋到变量 a=`grep '\(ab|cd\)' atxt ` 就行了
在python里就相当好办了,用不着grep啦,字符串的find函数就行啦


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13366285.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-22
下一篇 2023-07-22

发表评论

登录后才能评论

评论列表(0条)

保存