Linux文本处理三剑客之sed
推荐新手阅读【酷壳】或【骏马金龙】开篇的教程作为入门。骏马兄后面的文章以及官方英文文档较难。
【酷壳】:https://coolshell.cn/articles/9104.html
【骏马金龙-博客园】:https://www.cnblogs.com/f-ck-need-u/p/7499471.html
【sed官方】:https://www.gnu.org/software/sed/manual/sed.html
【sed的info手册】:# info sed
简介
sed是一款流编辑器,可以从STDIN或者文件中读取数据流,进行文本的过滤与转换。
工作原理
在高级的sed命令用法中,需要对工作原理有比较深的理解,一般使用的话就不一定要知道那么详细了。
sed持有两段数据缓冲区:模式空间(pattern space)和保持空间(hold space)。
sed会对文件的每一行做以下循环:首先,sed从输入流中读取一行数据,移除任何结尾的换行符(newline),然后将其放入模式空间中。然后执行命令;每一个命令,可以有与之关联的地址:地址就是一种条件码,只有在条件符合的情况下,那么命令才会被执行。
当最后一个脚本(script)执行完毕的时候,除非使用了-n选项,否则模式空间中的内容会被打印至输出流,加回被移除的末尾换行符。然后读取下一行继续这样的循环操作。
除非使用一些特殊的命令(像D命令),否则在两次循环间都会删除模式空间中的数据。而保持空间则会在每次循环中保留它的数据。
基本使用
# sed [OPTION]... {script} [input-file]...
OPTION:表示选项。
script:脚本。脚本有两部分构成,地址+命令。地址就是地址定界,符合地址定界范围内的行,才会被命令所执行。常见的有替换、删除等。
input-file:输入文件,可以是一个文件或者STDIN。
# sed 's/hello/world/' input.txt
# sed 's/hello/world/' < input.txt
# cat input.txt | sed 's/hello/world/' -
# cat input.txt | sed 's/hello/world/'
再次拆分如下。
# sed [OPTION]... {[address][command]} [input-file]...
脚本是必须要有的,如果脚本为空的话,则必须以“''”来表示。【选项】中有示例。
选项
-n, --quiet, --silent:sed每次会自动打印模式空间的内容,想要阻止这种行为,就使用该选项。
我们先来看一个例子。
[root@C7 tmp]# 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
在脚本的位置,我们使用空'',空脚本的话,表示没有限制地址范围并且没有命令,那么该文件中每一行进入模式空间,都不会被处理,然后最终每一行都会被自动打印出来。这是我们在【工作原理】中提到过的。
[root@C7 tmp]# sed '' 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
假设我们尝试打印第3行。3表示地址,明确是第三行,只有该行会被后面的命令p所作用;p表示打印模式空间的数据之意。
[root@C7 tmp]# sed '3p' 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
此时我们再加上-n选项,就可以抑制sed的自动输出,只输出我们所需要的。
[root@C7 tmp]# sed -n '3p' my.txt
This is my fish, my fish's name is george
-e script, --expression=script:脚本,除了可以写在CLI的引号中以外,还可以使用选项来指定。
-f script-file, --file=script-file:或者我们将脚本写入文本文件中,每行对应一个脚本,调用脚本文件来执行。
这种情况一般用于有多个脚本,多个脚本也可以使用分号分隔。
[root@C7 tmp]# sed -n '3p;4p' my.txt
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
[root@C7 tmp]# sed -n -e '3p' -e '4p' my.txt
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
[root@C7 tmp]# echo "3p" > script.txt
[root@C7 tmp]# echo "4p" >> script.txt
[root@C7 tmp]# sed -n -f script.txt my.txt
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
分号用于分隔脚本,容易和大括号的用法搞混,大括号主要用于命令分组。下文会描述。
-i[SUFFIX], --in-place[=SUFFIX]:表示就地修改(in-place)文件,可选的SUFFIX表示在就地修改是可以做备份操作,用于指定备份文件扩展名。
默认情况下,sed的操作不会修改原文件,仅将修改结果输出至STDOUT。
[root@C7 tmp]# sed '1,3d' my.txt
This is my goat, my goat's name is adam
[root@C7 tmp]# 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
而就地修改,则类似于将修改结果输出至原文件。默认的备份文件位置位于被操作文件所在目录下。
[root@C7 tmp]# sed -i.bak '1,3d' my.txt
[root@C7 tmp]# cat my.txt
This is my goat, my goat's name is adam
[root@C7 tmp]# cat my.txt.bak
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
在备份的时候,可以指定SUFFIX中可以使用目录+“*”的形式来指定将备份文件放置在其他目录下。
[root@C7 tmp]# sed -i/root/*.bak '1,3d' my.txt
[root@C7 tmp]# cat my.txt
This is my goat, my goat's name is adam
[root@C7 tmp]# cat /root/my.txt.bak
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
注意:-i选项后,要么不接内容表示就地修改不备份,要么接的内容就要是后缀或备份路径。例如下面这个例子。
# sed -Ei '...' FILE
# sed -iE '...' FILE
-i选项隐含了-s选项。
-s, --separate:默认情况下,sed将参数中的文件,全部视为一条长的连续的数据流。这主要会影响sed的地址定界功能。
[root@C7 tmp]# cat a.txt
a1
a2
a3
[root@C7 tmp]# cat b.txt
b1
b2
b3
[root@C7 tmp]# cat c.txt
c1
c2
c3
[root@C7 tmp]# sed -n '1p;$p' a.txt b.txt c.txt
a1
c3
正常我们可能会以为它会打印每个文件的首行和尾行。而其实,它类似于将所有文件cat成一个大文件后再做脚本处理。
[root@C7 tmp]# cat {a,b,c}.txt
a1
a2
a3
b1
b2
b3
c1
c2
c3
想要将每个文件单独分隔(separate)的话,就可以使用该选项了。
[root@C7 tmp]# sed -ns '1p;$p' a.txt b.txt c.txt
a1
a3
b1
b3
c1
c3
-E, -r, --regexp-extended:启用扩展正则表达式(ERE)。默认使用的是基础正则表达式(BRE)。
启用ERE后,与BRE的区别在于正则元字符的书写方式不太一样,启用ERE在正则的书写上,相对BRE要简洁很多。
关于正则,网上资料很多,我自己也写了一篇,可供参考《Linux文本处理三剑客之grep - 阿龙弟弟 - 博客园》,因此本文不会对正则及其元字符有过多介绍。
地址定界
地址定界,是sed是否执行命令的条件。由于sed是基于行的流编辑器,因此只有符合地址定界中的行,才会被执行命令。
空地址
即不指定地址,其表示对所有的行都执行操作。
单地址
单地址并不是说只匹配某一行,而是在地址定界中,只给出一个地址。例如通过模式匹配到的地址,可能就是多行。
m:这里的m是一个正整数,表示对第m行执行操作。其中“$”表示最后一行。
/regexp/:模式匹配,支持正则。表示匹配模式的行。
[root@C7 tmp]# sed -n '3p' my.txt
This is my fish, my fish's name is george
[root@C7 tmp]# sed -n '$p' my.txt
This is my goat, my goat's name is adam
[root@C7 tmp]# sed -n '/fish/p' my.txt
This is my fish, my fish's name is george
如果我们想匹配的是一个类Unix下的路径的话,那么regexp中会包含许多斜线。此时我们可以对其中的斜线执行转义。
sed -n '/^\/home\/alice\/documents\//p'
或者只用该类型的语法。
\cregexpc
c并不是关键字,可使用其他字符代替,只要前后一致就行。语法就可以避免那些啰嗦的转义字符了。
sed -n '\%^/home/alice/documents/%p'
sed -n '\;^/home/alice/documents/;p'
/regexp/I:忽略大小写(case Insensitive)匹配。注意,是大写的字母I,如果写成小写的i,那表示的是插入命令。
地址范围
m,n:第m行至第n行。m<n。若m>n,则表示第m行之意。
[root@C7 tmp]# sed -n '1,3p' /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
[root@C7 tmp]# sed -n '3,1p' /etc/passwd
daemon:x:::daemon:/sbin:/sbin/nologin
[root@C7 tmp]# sed -n '3,2p' /etc/passwd
daemon:x:::daemon:/sbin:/sbin/nologin
m,+n:第m行以及之后的n行。
[root@C7 tmp]# sed -n '1,+3p' /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
m,/regexp/:第m行至第一次匹配到模式的行。
[root@C7 tmp]# sed -n '1,/daemon/p' /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
0,/regexp/:如果正则匹配到的是首行(英文原文:very first)的话,那么它就会匹配第一行,否则就和“1,/regexp/”效果一样。
[root@C7 tmp]# seq | sed -n '1,/[[:digit:]]/p' [root@C7 tmp]# seq | sed -n '0,/[[:digit:]]/p' [root@C7 tmp]# seq | sed -n '0,/[234]/p' [root@C7 tmp]# seq | sed -n '1,/[234]/p'
/regexp1/,/regexp2/:从第一次匹配到regexp1的行至第一次匹配到regexp2的行。
[root@C7 tmp]# sed -n '/halt/,/operator/p' /etc/passwd
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
一般来说,regexp1出现的位置应该先于regexp2,如果不是的话,则等同于“/regexp2/,$”。
# sed -n '/operator/,/halt/p' /etc/passwd
该效果等同于operator所在行至行尾。
first~step:步进(stepping)。先定位first所在行,然后每次经过step行再定位一次。
最典型的示例就是显示偶数和奇数。
[root@C7 tmp]# seq | sed -n '1~2p' [root@C7 tmp]# seq | sed -n '0~2p'
显示5的倍数。
[root@C7 tmp]# seq | sed -n '0~5p'
addr1,~N:这个写法和【步进】以及之前的“m,+n”相似但不同,不要混淆。它的作用是从addr1所在的行至第一个可以被N整除的行。
[root@C7 tmp]# seq | sed -n '5,~4p'
地址取反
在地址和命令中,可以插入一个感叹号“!”,用来表示取反操作。
打印1~4行和15~行尾的数据。
# sed -n '5,15!p' FILE
命令
当符合地址定界条件后,就可以执行命令了。命令即sed具体所做的事情。
p:打印模式空间中的数据。一般结合-n选项使用,打印符合地址范围的行。
d:删除模式空间中的数据,并立即开始下一次循环。
[root@C7 tmp]# sed '2d' my.txt
This is my cat, my cat's name is betty
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
[root@C7 tmp]# sed '/goat/d' 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
a\
text
或者
a text:追加(append)文本。追加的意思是在加在指定行后面,即下一行。“a\”的后面,需要回车。
[root@C7 tmp]# sed '2a My name is alongdidi' my.txt
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
My name is alongdidi
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
[root@C7 tmp]# sed '2a\
> My name is alongdidi' my.txt
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
My name is alongdidi
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
i\
text
或者
i text:插入(insert)文本。插入的意思是在加在指定行前面,即上一行。
[root@C7 tmp]# sed '2i My name is alongdidi' my.txt
This is my cat, my cat's name is betty
My name is alongdidi
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
[root@C7 tmp]# sed '2i\
My name is alongdidi' my.txt
This is my cat, my cat's name is betty
My name is alongdidi
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
c\
text
或者
c text:替换(change)文本。将指定的行替换成text。这里的替换是整行替换,和s///命令的文本替换不一样。
[root@C7 tmp]# sed '2c My name is alongdidi' my.txt
This is my cat, my cat's name is betty
My name is alongdidi
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
[root@C7 tmp]# sed '2c\
My name is alongdidi' my.txt
This is my cat, my cat's name is betty
My name is alongdidi
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
如果被替换的行是多行的话,那么多行会被整体替换为text,而不是每一行都替换成text。
[root@C7 tmp]# sed '2,4c My name is alongdidi' my.txt
This is my cat, my cat's name is betty
My name is alongdidi
如果是多行的追加或者插入,则会在每个匹配的行上都执行追加或者插入操作。
追加、插入和替换的文本(text)中,都可以使用“\n”来表示换行,实现多行输入的功能。
[root@C7 tmp]# sed '2,4c along\ndi\ndi' my.txt
This is my cat, my cat's name is betty
along
di
di
=:打印行号,可惜不是在行首打印,而是在行位置的上一行打印,类似插入操作。
[root@C7 tmp]# sed '=' 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
r filename:在指定的行后追加文本,文本内容来自一个文件。
[root@C7 tmp]# cat a.txt
a1
a2
a3
[root@C7 tmp]# sed '2r a.txt' my.txt
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
a1
a2
a3
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
w filename:将匹配到的行写入另一个文件中。
这里使用了-n选项,抑制了sed命令执行完毕后,打印整个/etc/fstab文件的内容。
不过即便不使用-n选项,这些输出的多余内容,也是输出至STDOUT,而不会输出至filename中,因为w命令的执行,必须满足前面的地址定界条件。
[root@C7 tmp]# grep "^/dev/" /etc/fstab
/dev/mapper/centos-root / xfs defaults
/dev/mapper/centos-swap swap swap defaults
[root@C7 tmp]# sed -n '\c^/dev/cw /tmp/sed_write.txt' /etc/fstab
[root@C7 tmp]# cat sed_write.txt
/dev/mapper/centos-root / xfs defaults
/dev/mapper/centos-swap swap swap defaults
{cmd1; cmd2; ...}:命令的分组(group),这种一般适用于针对同一地址执行多个命令。
[root@C7 tmp]# seq | sed -n '2s/2/X/;p' X [root@C7 tmp]# seq | sed -n '2{s/2/X/;p}'
X
删除第3行至第6行中包含“This”字符串的。
[root@C7 tmp]# cat -n 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
[root@C7 tmp]# sed '3,6{/This/d}' pets.txt
This is my cat
my cat's name is betty
my dog's name is frank
my fish's name is george
This is my goat
my goat's name is adam
[root@C7 tmp]# sed '3,6{/This/{/fish/d}}' pets.txt
This is my cat
my cat's name is betty
This is my dog
my dog's name is frank
my fish's name is george
This is my goat
my goat's name is adam
文本替换
文本替换是sed命令中最常见的命令,sed官网甚至单独使用一个小节阐述它。语法如下。
s/regexp/replacement/[flags]
s命令在模式空间中尝试去匹配我们所给出的正则表达式regexp,如果匹配成功,则将匹配到的那部分(portion)替换为replacement。
[root@C7 tmp]# 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
[root@C7 tmp]# sed 's/my/your/' my.txt
This is your cat, my cat's name is betty
This is your dog, my dog's name is frank
This is your fish, my fish's name is george
This is your goat, my goat's name is adam
replacement中的“\n”表示引用regexp中的“()”的值,n取值范围为1~9,“\3”表示引用第三个“()”中的值。
[root@C7 tmp]# sed -E 's/.* ([a-z]+),.*\<([[:alpha:]]+)$/\1:\2/' my.txt
cat:betty
dog:frank
fish:george
goat:adam
replacement中的“&”表示引用整个regexp所匹配的内容。
[root@C7 tmp]# sed 's/cat/tom&/' my.txt
This is my tomcat, 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
和地址匹配类似,斜线“/”也可以换成其他任意字符作为固定字符。如果regexp或者replacement中包含了固定字符的话,那么应该将固定字符转义。
s///
s@@@
sccc
s/\/etc\/fstab/\/root\/a.txt/
s@/etc/fstab@/root/a.txt@
sed其实有两种标准,一种是POSIX兼容模式,另一种是GNU扩展。我们使用的是GNU sed,因此是支持GNU扩展的。
GNU扩展的sed,支持特殊序列(special sequence),它由一个反斜线和一个字母组成:
- \L:将replacement替换成小写直到遇到\U或者\E。
- \l:将下一个字符替换成小写。
- \U:将replacement替换成大写直到遇到\L或者\E。
- \u:将下一个字符替换成大写。
- \E:停止\U或者\L带来的大小写转换功能。
[root@C7 tmp]# sed 's/my/\Uyour/' my.txt
This is YOUR cat, my cat's name is betty
This is YOUR dog, my dog's name is frank
This is YOUR fish, my fish's name is george
This is YOUR goat, my goat's name is adam
[root@C7 tmp]# sed 's/my/\uyo\uur/' my.txt
This is YoUr cat, my cat's name is betty
This is YoUr dog, my dog's name is frank
This is YoUr fish, my fish's name is george
This is YoUr goat, my goat's name is adam
[root@C7 tmp]# sed 's/my/\Uyou\Er/' my.txt
This is YOUr cat, my cat's name is betty
This is YOUr dog, my dog's name is frank
This is YOUr fish, my fish's name is george
This is YOUr goat, my goat's name is adam
flags:文本替换专属的标记,用于改变替换的一些行为。
部分标记和命令是同一个字母,要根据字母出现的位置来判断是标记或者命令。
g:global,全局替换,默认情况下,s命令只替换行内第一个匹配的regexp,使用该选项将替换所有。
[root@C7 tmp]# sed 's/my/your/g' my.txt
This is your cat, your cat's name is betty
This is your dog, your dog's name is frank
This is your fish, your fish's name is george
This is your goat, your goat's name is adam
number:标记可以是一个数字,表示替换第几个匹配的regexp,默认是1。
[root@C7 tmp]# sed 's/my/your/2' my.txt
This is my cat, your cat's name is betty
This is my dog, your dog's name is frank
This is my fish, your fish's name is george
This is my goat, your goat's name is adam
对于GNU sed来说,g和number可以结合使用,表示从number位置开始替换至最后一个。
[root@C7 tmp]# cat sed_replace_flags.txt
a a a a a a
[root@C7 tmp]# sed 's/a/b/3g' sed_replace_flags.txt
a a b b b b
p:替换成功则打印。默认情况下,替换成功后会打印所有模式空间中的数据,如果我们结合-n选项和p标记的话,就可以只显示替换成功后的行。
[root@C7 tmp]# sed -n 's/dog/gouzi/p' my.txt
This is my gouzi, my dog's name is frank
i或者I:在匹配regexp的时候,忽略大小写。
w filename:替换成功的时候,把结果输出到文件。支持2个特殊文件,/dev/stderr和/dev/stdout。
[root@C7 tmp]# sed -n 's/my/your/gw change.txt' my.txt
[root@C7 tmp]# cat change.txt
This is your cat, your cat's name is betty
This is your dog, your dog's name is frank
This is your fish, your fish's name is george
This is your goat, your goat's name is adam
高级使用
高级使用主要涉及到sed的多行模式(multi-line mode),即模式空间中会存在多行的数据。需要理解上文提到的【工作原理】。
这块难度比较大,我自己也不太会用。平时使用中更多的还是善用正则实现sed的简单替换。
因此只这里列出多行模式相关的命令翻译。
g:使用保持空间的数据替换模式空间。
G:向模式空间追加一个换行,然后将保持空间的数据追加至模式空间。
h:使用模式空间的数据替换保持空间。
H:向保持空间追加一个换行,然后将模式空间的数据追加至保持空间。
x:将模式空间和保持空间的数据互换。
Linux文本处理三剑客之sed的更多相关文章
- Linux 文本处理三剑客之grep
文本处理都要使用正则表达式,正则表达式有: 基本正则表达式:grep或者egrep -G 扩展正则表达式:egreo或者grep -E Linux 文本处理三剑客: sed:stream editor ...
- Linux文本处理三剑客之grep及正则表达式详解
Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...
- 关于Linux文本处理“三剑客”的一些小操作。
Linux文本处理“三剑客”,即grep.sed.awk,这是Linux中最核心 的3个命令. 一.首先做个简单的介绍: 1.awk:linux三剑客老大,过滤,输出内容,一门语言.NR代表行号. 2 ...
- Linux文本处理三剑客之——grep
一Linux文本处理三剑客之——grep Linux文本处理三剑客都支持正则表达式 grep :文本过滤( 模式:pattern) 工具,包括grep, egrep, fgrep (不支持正则表达式) ...
- 文本处理三剑客之sed命令
第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...
- 文本处理三剑客之 Sed ——一般编辑命令
sed简介 sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk. sed又称 ...
- Linux文本处理三剑客之grep
简介 grep命令,用于在一个文本文件中或者从STDIN中,根据用户给出的模式(pattern)过滤出所需要的信息. grep以及三剑客中的另外两个工具sed和awk都是基于行处理的,它们会一行行读入 ...
- linux文本处理三剑客之 grep
文本处理无非是对文本内容做查看.修改等操作.Linux三剑客: grep.sed 和 awk 命令. 处理文本内容,用 Vim 编辑器不是很好吗?Vim 允许我们使用键盘.鼠标来对文本内容进行交互性地 ...
- linux文本处理三剑客的学习
linux下有三个文本处理的神器.分别是grep,sed,awk.功能都是比较强大的. grep帮助: http://my-study-grep.readthedocs.io/en/latest/ s ...
随机推荐
- Redis系列(四):Redis持久化和主从复制原理
一.持久化 所谓的持久化就是把内存中的数据写到磁盘中去,防止服务宕机后内存数据丢失.Redis4.0之前提供了两种持久化方式:RDB(默认) 和AOF,Redis4.x之后新增了一种混合持久化(本文所 ...
- Activiti工作流框架学习(一)之通用数据表详细介绍
文/朱季谦 Activiti工作流引擎自带了一套数据库表,这里面有一个需要注意的地方: 低于5.6.4的MySQL版本不支持时间戳或毫秒级的日期.更糟糕的是,某些版本在尝试创建此类列时将引发异常,而其 ...
- day20191001国庆默写
day20191001国庆默写恢复 重在理解,而不是死记硬背.认真专心看6遍,做6遍. 学会码字,每天码字二小时.持之以恒. 任重道远,出发,走多少算多少.100分的试卷,会做20分也比一个努力也没有 ...
- Bootstrap 元素居中设置
一.Bootstrap水平居中 1. 文本:class ="text-center" 2. 图片居中:class = "center-block" 3.其他元素 ...
- linux任务计划cron、chkconfig工具、systemd管理服务、unit和target介绍
第8周第1次课(5月14日) 课程内容: 10.23 linux任务计划cron10.24 chkconfig工具10.25 systemd管理服务10.26 unit介绍10.27 target介绍 ...
- 小白的springboot之路(一)、环境搭建、第一个实例
小白的springboot之路(一).环境搭建.第一个实例 0- 前言 Spring boot + spring cloud + vue 的微服务架构技术栈,那简直是爽得不要不要的,怎么爽法,自行度娘 ...
- 检测是否引入jQuery
if (typeof jQuery != 'undefined') { document.write("jquery已经被加载"); } else { document.write ...
- 新一代数据安全的制胜法宝-UBA
[摘要]在入侵防御领域,运用数据分析的方法保护数据的技术其实没有什么新的东西,比如防火墙-分析数据包的内容以及其他的元数据,如IP地址,从增长的数据条目中检测和阻断攻击者:防病毒软件不断的扫描文件系统 ...
- 基于antd封装一个高可用form组件 减少cv代码导致的bug
引言 在开发中台过程中 我们的原型中有很多表单,antd有表单组件,但是粒度比较细,就单纯组件而言,无可厚非,但是在开发过程中,可能会造成代码不够聚合,有些表单公共逻辑无法提取,copy paste比 ...
- KETTLE多表关联的同步一张表的两种实现方式
以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 在平时工作当中,会遇到这种情况,而且很常见.比如:读取对方的多个视图或者表,写入目标库的一张表中,就涉及到多表的同步. 多表同步可以有以 ...