8

bash, awk&sed&grep

 2 years ago
source link: http://antkillerfarm.github.io/linux/2020/05/02/bash.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

bash, awk&sed&grep

2020-05-02

https://www.gnu.org/software/bash/manual/bash.pdf

cheatsheet:

https://devhints.io/bash

这个网站除了bash的cheatsheet之外,还有好多其他方面的cheatsheet。

https://www.ibm.com/developerworks/cn/linux/l-linux-shells/

评估Linux中的shell

Thompson shell

Ken Thompson于1971年开发了第一个用于UNIX的shell,名为V6 shell。该shell为重定向(< > 和 »)和管道( 或 ^)引入了一种紧凑的语法,并支持参数扩展的模式匹配,比如*.txt。但它缺少编写脚本的能力。

Bourne shell,由AT&T公司的Steve Bourne开发(1977)。它引入了控制流、循环和变量,从而具备了脚本的能力。

Stephen Richard “Steve” Bourne,1944年生,英国计算机学家。King’s College London本科+Cambridge博士。先后工作于Bell Labs、Silicon Graphics, DEC, Sun和Cisco。ACM主席、皇家天文学会会员。除了bsh之外,他还发明了adb debugger for UNIX。

csh是Bill Joy设计的(1978),它的语法类似C语言,故名。主要改进是添加了历史记录。

William (Bill) Nelson Joy,1954年生,美国计算机科学家。University of Michigan本科+UCB硕士(1979)。他的知名作品包括BSD、vi、csh、chroot、TCP/IP driver、Java、SPARC、Solaris、NFS。Sun创始人兼首席科学家。

tcsh由Ken Greer在CMU开发(1981),它在csh的基础上,提供了文件名补全的功能。后来Mike Ellis又加入了命令补全的功能(1983)。

Korn shell (ksh) 由David Korn设计的(1983),它在bsh的基础上添加了一些csh、tcsh引入的功能。

Bourne-Again Shell(或 Bash)是一个开源 GNU 项目,旨在取代 Bourne shell。它由Brian Fox开发(1989),吸取了ksh、csh等的功能,现已成为世上最流行的shell。在通常语境中,如果没有特指的话,shell一般就是指的bash。

zsh由Paul Falstad开发(1990)。它的功能极其强大,但也由于配置过于复杂,所以初期无人问津。直到有一天,国外有个穷极无聊的程序员开发出了一个能够让你快速上手的zsh项目,叫做“oh my zsh”:

https://github.com/ohmyzsh/ohmyzsh

https://zhuanlan.zhihu.com/p/19556676

终极Shell——ZSH

Fish Shell

吸取了zsh的经验,Fish Shell主打的是开箱即用。

http://fishshell.com/

http://www.ruanyifeng.com/blog/2017/05/fish_shell.html

Fish shell入门教程

BusyBox

BusyBox由Bruce Perens设计(1995),号称是“The Swiss Army knife of Embedded Linux”。

Thompson shell以及之后的shell,其设计思路是一个shell主程序+若干命令程序。这里的命令甚至包括shell中的一些语法成分,比如test和[。是的,你没看错,[也是一个应用程序。

而BusyBox为了发布和部署的方便,将一个shell和所有命令合并到一个可执行文件中。

https://busybox.net/

空格和TAB的细节

在大多数编程语言中,空格和TAB都不是有意义的字符,有没有或者有多少都无所谓。但Linux Shell不是这样的,尽管它看起来并没有如python那样的对缩进的强制语言规定。

以下是它在使用空格和TAB时的一些细节:

1.makefile文件中,规则定义部分的shell脚本命令需要使用TAB开头,使用空格会出错。

2.if命令的格式:

if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
	echo "OK, continue"
fi

注意一下上面脚本中的表达式[]之间的部分。其中所使用的空格不可省略,否则会出错。bash在处理[]表达式的时候,实际上调用了/usr/bin/[命令。如果把[当作特殊名称的普通命令的话,就会发现这里的空格用法实际上并不奇怪。

查看当前使用的shell

实时查看:

ps | grep $$ | awk '{print $4}'

非实时查看:

echo $SHELL

return和exit的区别

return用于函数的返回,它只能用在函数中。

exit用于整个shell脚本的退出。

预定义变量

$?: 上条命令的返回值

$$: 当前shell的PID。

shell如何把多行内容输出到一个文件

一行一行echo重定向显然是个笨办法,这里可以使用Here Documents语法。

(
cat<<EOF
line 1
line 2
EOF
)>a.txt

https://linux.die.net/abs-guide/here-docs.html

Here Documents

cd -:回到上一次所在的路径的命令。当需要在两个相隔较远的路径下,相互切换的时候,可以使用该命令。

pushd <dir1>:将dir1添加到一个栈顶。栈中每个目录都有一个序号(栈顶为0)。使用pushd +n将第n个目录切换到栈顶。(栈顶即为当前目录,所以无论添加还是切换栈顶,都可以切换当前目录)

pushd -n的含义刚好相反,它从栈底向栈顶方向计数。

popdpopd +n用于从栈中删除目录。

dirs -v用于查看栈中元素。

bd是cd的升级版,主要处理cd ../../../这样的回退情况。

假设当前路径为:/home/user/project/bd h可以直接退到/home,只要输入路径的首字母就可以了。

sudo apt install bd
echo 'alias bd=". bd -si"' >> ~/.bashrc
source ~/.bashrc

https://www.jianshu.com/p/53cccae3c443

Linux中的pushd和popd

批量修改后缀名

rename 's/\.pgf/\.tex/' *

复制:Ctrl+Shift+c

粘贴:Ctrl+Shift+v

历史命令搜索:Ctrl+r

https://mp.weixin.qq.com/s/DQzlfQXt4dV9PYwoVdomaw

如何开发多彩动感的终端UI应用

定制提示符

export PS1="\u@\H >

https://blog.csdn.net/ice_beauty1/article/details/82923083

定制bash提示符

Shebang

Shebang(也称为 Hashbang )是一个字符序列#!,其出现在文本文件的第一行的前两个字符。在文件中存在 Shebang的情况下,类Unix操作系统的程序加载器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数。

#!/bin/bash

fg & bg

Ctrl+C

终止并退出前台命令的执行,回到SHELL

Ctrl+Z

暂停前台命令的执行,将该进程放入后台,回到SHELL

查看当前在后台执行的命令,可查看命令进程号码

运行命令时,在命令末尾加上&可让命令在后台执行

将命令进程号码为N的命令进程放到前台执行,同%N

将命令进程号码为N的命令进程放到后台执行

bash并行

for i in {1..255}
do
{
  ...
} & ##后台并行执行
done
wait ##等待上面的后台进程执行完成

https://blog.csdn.net/zhaoyq008/article/details/103480909

bash并行

https://www.cnblogs.com/xuxm2007/p/5820633.html

Bash脚本实现批量作业并行化

Other

bash --norc --noprofile

不运行bashrc和bash_profile。

https://github.com/dylanaraps/pure-bash-bible

本项目主要汇总了bash脚本经常会使用到的一些代码片段,并按照字符串、数组、正则表达式、文件处理、变量等常用功能进行分类,并给出了具体的Demo,非常适合初学者以及希望提升工作效率的朋友使用。

https://mp.weixin.qq.com/s/ZaIX8jv9LMWmrHQb4ew-dQ

写好shell脚本的13个技巧

http://www.ywnds.com/?p=12325

Shell版俄罗斯方块

https://mp.weixin.qq.com/s/SBVEo53irSZfI40sBFZXWQ

shift:解决shell编程中的入参问题

https://mp.weixin.qq.com/s/T_XwLS6CIrkXbgXJVIo2Jw

一文了解十大Linux命令行工具!

https://mp.weixin.qq.com/s/euTQJy0HFVQotAY-KI2OzA

10个实战及面试常用Shell脚本编写

https://github.com/jaywcjlove/linux-command

Linux命令大全搜索工具

https://mp.weixin.qq.com/s/xuC_pH1X_GmyK0vVWrBzWQ

10个实战与面试常用Shell脚本编写

https://zhuanlan.zhihu.com/p/84774691

bash下可控任务数的并发执行脚本

https://blog.csdn.net/taiyang1987912/article/details/39551385

shell中各种括号的作用()、(())、[]、[[]]、{}

https://mp.weixin.qq.com/s/NNAjrUv5jBN8zxnsxbBmkw

Shell分析服务器日志命令

awk&sed&grep

这三个工具是文本处理中用的比较多的工具,各有各的特色,且都支持正则表达式。

一般来说,行处理优先考虑使用sed和grep,列处理优先考虑使用awk。通常情况下,组合使用多个命令,其命令编写的难度小于只使用一个命令。比如sed和grep也可以进行列处理,但语法难度远超awk,反之亦然。

这里不打算列出各个命令的选项,而仅列出使用它们的一些示例:

这里假设我们有一文件名为ab。

awk '{print $1}' ab #显示第一列

https://mp.weixin.qq.com/s/-mWYn195TBSB1lDlncuYeA

常用命令之awk常用实例

https://mp.weixin.qq.com/s/IXHKtRKd7Zl8iT9zd2ONsg

活跃了40年的AWK现在怎么样了?

AWK,1977年诞生于贝尔实验室。其名称来自其作者的名字缩写:Alfred Aho,Peter Weinberger和Brian Kernighan。

sed '1d' ab #删除第一行 
sed '$d' ab #删除最后一行
sed '1,2d' ab #删除第一行到第二行
sed '2,$d' ab #删除第二行到最后一行

sed -n '1p' ab    #显示第一行 
sed -n '$p' ab    #显示最后一行
sed -n '1,2p' ab  #显示第一行到第二行
sed -n '2,$p' ab  #显示第二行到最后一行

sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby

sed -e 's/.$//' mydos.txt > myunix.txt #dos->unix
grep 'ruby' ab #查询包括关键字ruby所在所有行
grep -nri 'ruby' #n 显示行号,r 子目录搜索,i 忽略大小写
ip addr show br-lan | grep 'inet ' | awk  '{print $2}' | sed 's/\/.*//g'

https://mp.weixin.qq.com/s/o1vuL3RrWz9tyUPguZeSWA

简单快捷的数据处理,数据科学需要注意的命令行


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK