做暧小视频免费视频在线观看网站公司网站做的好的
news/
2025/9/23 0:14:22/
文章来源:
做暧小视频免费视频在线观看网站,公司网站做的好的,手机自助网站建设,网站搭建系统awk从放弃到入门#xff08;11#xff09;#xff1a;拾遗之”三元运算”与”打印奇偶行” 三元运算打印奇偶行 本博文转载自 这篇文章中的知识点是建立在前文的基础上的#xff0c;如果你还没有掌握前文中的知识#xff0c;请先参考之前的文章。
这篇文章其实是对之前知… awk从放弃到入门11拾遗之”三元运算”与”打印奇偶行” 三元运算打印奇偶行 本博文转载自 这篇文章中的知识点是建立在前文的基础上的如果你还没有掌握前文中的知识请先参考之前的文章。
这篇文章其实是对之前知识点的拾遗有些遗漏的常用知识点会在这篇文章中介绍。
三元运算 还记的我们在学习awk的 “if…else” 结构时举的例子吗我们来回顾一下。
在centos6中我们可以判断用户的UID是否小于500如果用户的UID大于500则用户为普通用户如果用户的UID小于500则用户为系统用户。
所以我们可以通过awk的 “if…else结构”判断用户的UID范围从而判断出用户属于哪种用户类型示例如下 正如上图所示我们使用”if…else”结构对usertype变量进行了赋值如果用户的UID小于500则对usertype变量赋值为”系统用户”,否则则赋值usertype变量为”普通用户”最后打印出用户名所在的列与usertype变量的值。
其实我们可以使用三元运算替换上例中的”if…else”结构语句示例如下 正如上图所示红线标注部分则使用了三元运算的语法代替了之前”if…else”的语法而三元运算的语法如下
条件 结果1 结果2
上述语法表示如果条件成立则返回结果1如果条件不成立则返回结果2。
而上例中”$3500″就是上述语法中的”条件””系统用户”就是上述语法中”?”后面的”结果1″”普通用户”就是上述语法中”:”后面的”结果2″ 同时在上例中我们使用usertype变量接收了三元运算后的返回值所以当条件成立时usertype变量被赋值为”系统用户”当条件不成立时usertype变量被赋值为”普通用户”。
是不是很方便其实三元运算还有另外一种使用方式示例如下 我们通过上述命令统计出了系统用户有42个普通用户有7个上图中红线标注的用法可以理解为三元运算的另一种语法。如下
表达式1 ? 表达式2 : 表达式3
上述语法表示如果表达式1为真则执行表达式2如果表达式1为假则执行表达式3
而上例中”$3500″即为表达式1”a”即为表达式2”b”即为表达式3
也就是说当每遇到一个UID小于500的用户我就对变量a加1否则我就对变量b加1从而算出了系统用户与普通用户的数量最后再END模式中输出了变量a与变量b的值。
是不是很容易理解你一定已经明白了。
打印奇偶行 如果我们想要使用awk打印文本中的奇数行或者偶数行则是非常简单的。
我们先来看看怎样使用awk打印奇数行或偶数行然后再结合示例解释原理所以看不懂没关系后面会有解释。 正如上图所示test12文件中有11行文本我们可以使用非常简洁的awk命令打印出了奇数行或者偶数行。
但是如果我们想要彻底搞明白原理则需要搞明白如下两个知识点后面会有更详细的解释
1、在awk中如果省略了模式对应的动作当前行满足模式时默认动作为打印整行即{print $0}。
2、在awk中0或者空字符串表示”假”非0值或者非空字符串表示”真”
上述两个知识点是什么意思呢我们慢慢聊。
在之前介绍awk模式的文章中提及过模式可以理解为条件如果当前行能与模式匹配则会执行对应的动作。示例如下 上图中的两个命令均使用到了模式
第一个命令表示如果当前行中包含字符”1″则执行对应的动作而对应的动作就是打印整行。
第二个命令表示如果test12文本中文本行的第二列的值如果大于10则执行对应的动作而对应的动作就是打印整行。
那么如果我们将上例中awk命令中的动作都省略会出现什么情况呢我们来试试。 我们发现当使用了模式时如果省略了对应的动作会默认的输出整行。
也就是说当使用了模式时如果省略了模式对应的动作默认动作为”{print $0}”
当然”空模式”与”BEGIN/END模式”除外。
这就是第1个知识点的含义我想你应该明白了那么我们来聊聊第2个知识点。
在awk中0或者空字符串表示”假”非0值或者非空字符串表示”真”什么意思呢我们还是可以从模式说起”模式”可以理解为”条件”当条件成立则为真当条件不成立则为假所以当模式为真时则会执行对应的动作当模式为假时则不会执行对应的动作。
那么我们能不能直接把模式替换为”真”或者”假”呢我们来试试。 上例中命令1使用了”空模式”也就是说每一行都满足模式每一行经过”空模式”匹配以后结果都是”真”所以每一行都会执行对应的动作。
命令2中原来”模式的位置”被替换为了数字”1″我们可以把数字”1″理解成一种模式匹配后的结果而1是非零值刚才说过在awk中非零值表示真所以”1″表示”真” 换句话说就是模式的匹配结果为真模式成立则会执行对应的动作而命令2中对应的动作为打印整行。
命令3 与 命令2 同理在命令3中 数字”2″为非零值表示真可以理解为模式的匹配结果为真则会执行对应的动作聪明如你一定想到了数值”2″可以换做任何非0值或者非空字符串。
命令4中数字”2″为非零值表示模式为真而之前说过当使用模式时可以省略动作当使用模式并省略动作时默认动作为打印整行所以命令4表示打印所有行因为每一行的模式都为真。
命令5与命令6同理在awk中数字”0″与空字符串表示假当模式为假时不会执行对应的动作而当存在模式并省略动作时默认动作为打印整行但是由于模式为假所以对应的动作并未执行。
其实我们还能对真与假进行取反非真即为假非假即为真示例如下。 正如上图所示我们使用”!”对真假进行取反。
如果你已经看懂了上面的例子那么我们再来延伸一下。
你猜猜如下示例会输出什么 没错聪明如你一定想到了上例中其实是使用了awk的变量将变量 i 赋值为1当 i1 以后i为非零值表示为真我们可以认为这是一种模式匹配后的结果当模式为真时同时省略了对应动作时默认动作为打印整行所以上例会输出test3中的所有行。 理解完上述示例以后我们再回过头来看看之前打印奇数行的示例你可能就会明白了。 当awk开始处理第一行时变量 i 被初始化变量 i 在被初始化时值为”空”而awk中数字0或者”空字符串”表示假所以可以认为模式为假但是 i 直接取反了对假取反后的值为真将取反后的值又赋值给了变量i此刻变量i的值为真所以当awk处理第一行文本时变量i的值被赋值为真模式成立则需要执行对应的动作而上例中又省略了动作所以默认动作为”{print $0}”所以第一行被整行打印了。
当第一行文本处理完毕后awk开始处理第二行文本此时i 为真但是取反后i 为假所以第二行没有被输出依次类推最终只打印了奇数行。
为了能够更加直观的看到上述过程我们将i的值打印出来通过如下动作能够打印出处理每一行时i 对应的值。 当然聪明如你我就不用再解释打印偶数行的原理了我想你应该已经能够举一反三了。
好了这篇文章就写到这里希望能够对你有所帮助 客官常来呦~~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910848.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!