好久没记录shell相关的代码了,现在记录一下吧。
这个命令顾名思义,就是可以裁剪一串字符串,怎么裁剪,当然是根据分隔符。
后面是分隔符
打印分割后的相关域
user@host037-ubuntu-1804:~/android/.repo/manifests$ git branch -a
* default
remotes/m/zhimo-mr1 -> origin/zhimo-mr1
remotes/origin/android-clang-dev
remotes/origin/android-llvm
remotes/origin/android-llvm-dev
remotes/origin/aosp/android-10.0.0_r20
remotes/origin/aosp/android-10.0.0_r25
remotes/origin/aosp/android-10.0.0_r29
remotes/origin/eswin-master
remotes/origin/master
remotes/origin/zhimo-aosp
remotes/origin/zhimo-gcc
remotes/origin/zhimo-kernel
remotes/origin/zhimo-mr1
remotes/origin/zhimo-mr1-dev
如果只想打印第三行的分支,则可以:
~/android/.repo/manifests$ git branch -a | cut -d / -f 3
* default
zhimo-mr1 -> origin
android-clang-dev
android-llvm
android-llvm-dev
aosp
aosp
aosp
eswin-master
master
zhimo-aosp
zhimo-gcc
zhimo-kernel
zhimo-mr1
zhimo-mr1-dev
要说 shell 编程,绝对是一个瑞士军刀级别的工具,效率惊人的很。
这个需求是我自己整理博客时提出来的。为什么?原因是这样的,在我上一篇文章 中,我也已经提出来了,更换了博客主题,同时也无意间看到该博主实现了标题导航 的功能,这个确实吸引人的,那么,我的博客应该如何实现这个功能呢?
幸运的是,我的文档就是使用Markdown,只需添加两行代码即可完成:
* content
{:toc}
但是,这个代码要添加在什么位置呢?一般来说,我的博客正文是这样的:
---
title: awk和sed的简单实用
category: shell
layout: post
---
一般情况下也就是从第六行开始,为了安全起见,第六行空一行。下面是我根据网络 资源搜集的脚本并测试还可以的:
sed -i '7 i* content\n{:toc}\n' `grep layout -rl .`
这句命令简单了解一下就是,sed命令,指定在第7行插入* content\n{:toc}\n
,’\n’
是换行的意思,i是在第7行前,a是在第7行后,这里是为了与vim相一致。后面一句grep
是
为了能够在多个文件中插入(另一句就是如何在特定目录中的所有文件中特定的位置插入代码)
一般的模式是's/regexp/replacement/flags'sed 的模式匹配就是使用/
开始,以上面的连接中例子:
$ cat pets.txt
This is my cat
my cat's name is betty
This is my dog
my dog's name is frank
This is my fish
my fish's name is george
This is my goat
my goat's name is adam
则命令:
sed "s/my/Bo's/g" pets.txt
其中, s
是替换, g
是全局
如果想将输出的结构保存在一个文本内
-i
选项在这里也可以看出来,sed 后面的操作(不算-*这种选项),首先是动作s
,接着是model-str1/model-str2
,最后是作用域符号。
上面的说法有些不准确,更准确的说法是s
后面紧跟的东西是正则表达式。
s
可以指定范围,3,6s/reg/matched/g
,g
也可以同理。
sed 's/^/#/g' pets.txt
在每一行的第一列插入字符#
一些简单的正则表达式介绍:
^
,一行的开头 ^#
配置每行以 # 开头$
每行结尾 }$
匹配以}
结尾\<
表示词首 \<abc
匹配以abc
为首的.
任何单个字符星号
匹配0次或者多次[]
集合,其中^
为取反&
在匹配域中可以作为匹配的变量来使用。
yubo@win:~/test/shell$ sed 's/my/[&]/g' word.txt
this is [my] cat
[my] cat's name is betty
This is [my] dog
[my] dog's name is frank
This is [my] fish
[my] fish's name is george
This is [my] goat
[my] goat's name is adam
方括号匹配,需要转义.
echo "[]" | sed 's/\[.*\]/aaa/g' # aaa
这个不需要转义。
echo "()" | sed 's/()/[]/g' # []
不需要转义。
echo "{}" | sed 's/{}/()/g' # ()
当需要匹配数字、字母等使用中括号时(比如说为了匹配的个数),不要转义,但是,大括号作为特殊字符的时候,需要转义
echo "333" | sed 's/[0-9]\{3\}/[&]/g' # [333]
当需要适配符,比如\1
来代替匹配变量时,是需要对大括号
加转义的。
echo "{123456}" | sed 's/{\([0-9]*\)}/\1/g'
# 123456
与此对应的还有 +
和*
在做为特别字符时候+
必须转义为 \+
才有效, 而*
则不需要。
echo "ccc" | sed 's/c*/i like &/g' # 正确 i like ccc
echo "ccc" | sed 's/c\*/i like &/g' # 错误 ccc
echo "ccc" | sed 's/c\+/i like & too/g' # 正确 i like ccc too
这也就是下面介绍的. 正则表达式中”方括号”特殊的符号 sed正则表达式匹配,各种括号的转义和不转义
一个重要的原则是,使用括号括起来的正则表达式,是可以当成变量来使用的,其中,
使用的话使用\1,\2...
.
cat my.txt
This is [my] cat, [my] cat's name is betty
This is [my] dog, [my] dog's name is frank
This is [my] fish, [my] fish's name is george
This is [my] goat, [my] goat's name is adam
比如,我想在 http 前面插入 [trusted=yes]
这个字段使用
sed -i 's/指定字段/目标字段&/' file
cat /etc/apt/sources.list
deb http://ftp.ports.debian.org/debian-ports/ sid main
deb-src http://ftp.ports.debian.org/debian-ports/ sid main
# sed -i 's/http/[trusted=yes] &/' tmp.txt
# cat tmp.txt
deb [trusted=yes] http://ftp.ports.debian.org/debian-ports/ sid main
deb-src [trusted=yes] http://ftp.ports.debian.org/debian-ports/ sid main
sed的命令模式在形式上与上述不同,可以通过表达式最前面的字符判断是不是命令, (一般都是 sed “/reg/express/”)
-n
把下一行的内容纳入当成缓冲区做匹配.
可以看成一个grep的命令
以上面my.txt
为例,使用
sed '/fish/p' my.txt
This is [my] cat, [my] cat's name is betty
This is [my] dog, [my] dog's name is frank
This is [my] fish, [my] fish's name is george
This is [my] fish, [my] fish's name is george
This is [my] goat, [my] goat's name is adam''''
我们看到匹配的fish打印了两行,这是因为sed也处理的信息也打印出来了.解决这个问题的方
式是使用-n
选项。
sed -n '/fish/p' my.txt
This is [my] fish, [my] fish's name is george
这里所谓的FAQ,是自己将不会的记录在这里,定期回顾.
这个命令来自于aosp,来看一看具体的表现形式:
sed -n "/^[[:blank:]]*function /s/function \([a-z_]*\).*/\1/p"
当时,看这个命令没少费劲,一个是表现形式,一个是[[:blank:]]
.
[[:blank:]]
,这个是寻找以非NULL结尾的空白格语句(常见于DOS系统中可能)
here解释的很清楚,sed '/^$/d' filename
只会针对NULL的列,另一个方案使用非POSIX的\s*
,其中\s
是非字符串的意思, 星号
是0个或者多个,但是这个是NON POSIX的方式.
sed '/^\s*$/d' file
你可以看一下将会打印所有的none black lines
grep -v '^/s*$' file
POSIX的方案是:
sed '/^[[:blank:]]*$/d' file
sed -En '/^password: / s,^password: "(.*)"$,\1,p'
先不看-En
,在上述的代码中,比较陌生的是,
这只是一个定界符,我们可以使用任何符号去
当做定界符,为了上面好分析,我们可以使用#
或者/
这里使用,
是因为要处理的是
passwd文件,里面有大量的/
符号.
sed '/^password: / s#^password: "(.*)"$#\1#p'
其中:
/^password: /
: finds an input line that starts with password:
;
s#^password: "(.*)"$#\1#p
:
finds and captures double-quoted string after password: and replaces the entire line with the captured string \1 ( so all that remains is the password )””
他这里首先查找了在使用?
首先这次更换主题为 HyG
有几个改进的地方:
参考这篇文章
char *str1="absde";
char str2[]="absde";
char str3[8]={'a',};
char ss[] = "0123456789";
输出:
sizeof(str1)=4;
sizeof(str2)=6;
sizeof(str3)=8;
sizeof(ss)=11
结合最近同学们对于Nvidia显卡的问题,我想有必要整理一下相关的概念。
这里只是简单的说说Debian系统。
对于桌面系统而言,你在不想使用桌面系统的时候,可以使用 init 3
进入字符系统,使用init 5
返回桌面系统。
After test can be deleted:
git remote add origin https://github.com/username-or-organization-name/your-remote-repository-name
像我而言,真的没有必要开启桌面系统,我只是简单的了解内核的使用,基本不使用桌面,浪费的内存还是相当的严重,那么,我就需要一种方案禁用桌面系统。最简单的就是:
sudo vim /etc/default/grub
修改其中的几项
...
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
...
#GRUB_TERMINAL=console
为:
#GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX="text"
...
GRUB_TERMINAL=console
更新grub
sudo update-grub #or
sudo update-grub2
sudo systemctl set-default multi-user.target
然后重启即可。
诸位大哥请不要贸然使用apt remove lightdm
,有些网络服务是用的这个,不然你的机器就死机了。
说一下systemctl.
这个命令就是原来service的前身,还记得我们以前经常使用的sudo /init.d/xx restart|stop
的命令吗?systemd就是替换这个命令的。它的作用在以下几个方面.
进入字符界面:systemctl set-default multi-user.target
,相应地,进入桌面系统systemctl set-default graphical.target
systemctl enable ***.service
systemctl disable ***.service
systemctl start/stop/restart ***.service
systemctl status ***.service
2019年9月10日,是一个特殊的节日。
在一个不经意间,谁也不知道自己的下一秒会发生什么事情,哎,别钻牛角尖。
在一个特殊的时刻,某人的一生就定格在那里:他会怎么甘心呢?孩子、老人和伴侣从此以后就两个世界了。
高中时候经历过自己的发小出意外,当时就是不敢相信,现在也是不敢相信,如今,我在这里写下这个短篇,是希望,为你担心的人减少些痛苦。
RIP!!
自己啊,还得对社会有贡献,不枉此行!
这个短文的日期故意往前调了一年整。
是的,目前,最新的(2.11.X)不支持4.18以上的版本,这个要求有点扯啊,还好,自己可以指定版本并编译内核镜像。
The ovs needs the ovsdb, ovs-vswitchd, ovs-vsctl, but both of them will be closed by default after shutting down computer stackoverflow
如果你没有指定安装目录,那么:
yubo@debian:~$ ovs-vsctl add-br ovs-switch
ovs-vsctl: unix:/usr/local/var/run/openvswitch/db.sock: database connection failed (No such file or directory)
上面的脚本位于:
sudo find / -name ovs-ctl
/usr/local/share/openvswitch/scripts/ovs-ctl
^C
yubo@debian:~/git/ovs$ sudo /usr/local/share/openvswitch/scripts/ovs-ctl start
并且最好形成自己的脚本:
#!/bin/bash
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
--pidfile --detach
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach