mysql之模糊查询的方法

1.主要有两种方式:

like与SQL通配符  和  正则表达式模糊查询。

2.like与SQL ,必须使用like关键字

  • SQL的通配符如下:

% 百分号: 替代一个或者多个字符

_  下划线:仅替代一个字符

[字符列]  :字符列中任何一个单一字符

[^字符列] 或者[!字符列]:  不在字符列中的任何一个单一字符

  • 用法如下

select 字段列表 from 表名 where 字段 like ‘Ne%’;     表示:查询以Ne开头的数据

select 字段列表 from 表名 where 字段 like ‘%Ne%’;  表示:查询含有Ne的数据

select 字段列表 from 表名 where 字段 like ‘L_ve’;     表示:查询含有 L+某一个字符+ve的数据

select 字段列表 from 表名 where 字段 like ’[abc]%’;  表示:查询a/b/c开头的数据

3.正则表达式模糊查询 必须使用regexp关键字

牢记如下规则:

 . , 尖角符  ^ , 美元符 $ ,  字符集 [ ] ,  逻辑或 |  , 星号 * , 加号 + , 问号 ,大括号 { }

  • 语法如下:

select 字段列表 from 表名 where 字段 [not] regexp [binary] ‘正则表达式’;

  • 用法如下:

select 字段列表 from 表名 where 字段 regexp ‘j.’ ;   表示:查询 j 开头且为两个字符的数据

select 字段列表 from 表名 where 字段 regexp ‘158[0-9]{9}’;  表示:查询 158开头,11位的电话号码

。。。。。。

三、总结

  • 正则表达式的模式匹配比like 运算符的模式匹配更加强大、灵活。

Mysql模糊查询正常情况下在数据量小的时候,速度还是可以的,但是不容易看出查询的效率,在数据量达到百万级,千万级的甚至亿级时 mysql查询的效率是很关键的,也是很重要的。

一、一般情况下 like 模糊查询的写法:前后模糊匹配

这个SQL语句,如果用explain解释的话,我们很容易就能发觉它是没有走索引搜索,而是对全表进行了扫描,这显然是很慢的,还有卡库的可能。

如果将上面的SQL语句改成下面的写法:

就是把‘keyword’前面的%去掉了,这样的写法用explain解释看到,SQL语句使用了索引,这样就可以大大的提高查询的效率。

有时候,我们在做模糊查询的时候,并非要想查询的关键词都在开头,所以如果不是特别的要求,”keywork%”并不合适所有的模糊查询。

二、模糊查询高效的方法:

1、LOCATE(’substr’,str,pos)方法

解释:返回 substr 在 str 中第一次出现的位置,如果 substr 在 str 中不存在,返回值为 0 。如果pos存在,返回 substr 在 str 第pos个位置后第一次出现的位置,如果 substr 在 str 中不存在,返回值为0。

实例:

备注:keyword是要搜索的内容,business为被匹配的字段,查询出所有存在keyword的数据

2、POSITION(‘substr’ IN `field`)方法

其实我们就可以把这个方法当做是locate()方法的别名,因为它和locate()方法的作用是一样的。

实例:

3、INSTR(`str`,’substr’)方法

格式:

实例:

除了上述的方法外,还有一个函数FIND_IN_SET,这个方法比较特殊,他所查询的必须要是以“,”分隔开。

4、FIND_IN_SET(str1,str2):

返回str2中str1所在的位置索引,其中str2必须以”,”分割开。

格式:

实例:

安卓Android-x86 4.4联网设置教程 解决不能上网

  • Android-X86

    Android-X86

    Android-X86是一个可以PC上运行的安卓系统

    软件大小:339.25 MB下载

  Android-x86 4.4安装完成后一般都是不能上网的,需要给网卡设置IP地址和DNS服务器方可联网。Android-x86在本质上就是Linux系统,且Android-x86自带了终端(类似Windows的命令行),可以通过Linux命令直接设置上网参数。下面就随小编来来看看安卓Android-x86 4.4联网设置教程。

安卓Android-x86 4.4联网设置方法

方法一:自动获取IP(推荐)

1.打开“终端模拟器”。

安卓Android-x86 4.4联网设置教程 解决不能上网

2.输入“su”并回车,使终端模拟器获得root(超级用户)权限,直接点击【允许】。终端模拟器的提示符会变成“root..#”,表示正在使用的是超级账户。

安卓Android-x86 4.4联网设置教程 解决不能上网

3.输入“dhcpcd eth0” 使网卡自动获得IP。提示:如果失败,在终端输入“ip a”看最后一项是ethX(X代表0123等数字)。

安卓Android-x86 4.4联网设置教程 解决不能上网

4.继续输入“setprop net.dns1 114.114.114.114”,不提示任何信息就表示设置成功了。提示:小编使用的是114DNS,你也可以换成其他DNS地址。

方法二:设置静态IP地址

1.在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0

安卓Android-x86 4.4联网设置教程 解决不能上网

2.填写ip地址、子网掩码、网关、DNS等红框内的必填项目。点击“File”菜单,选择“Save”保存退出。

安卓Android-x86 4.4联网设置教程 解决不能上网

3.重启网络服务。在终端继续输入:service network restart

安卓Android-x86 4.4联网设置教程 解决不能上网

网络配置

剛安裝好的 Android-x86 4.0 是無法連線到網路的,因為還未設定網路的 IP 位址,這裡必須要手動地設定 IP 位置。

在 App 清單中開啟 Terminal Emulator。

開啟後會出現終端機介面,接著輸入 ip a 就會列出目前的網路卡。這裡可以看到 eth0 目前是還沒有設定 IP 的狀態

設定 IP 可以透過手動設定 IP 或者也可以透過 DHCP。

透過 DHCP 取得 IP

如果你的網路環境有 DHCP Server 的話,透過 DHCP 的方式取得 IP 是最簡單的方式。

在終端機輸入

su

dhcpcd eth0

接著就會自動取得 IP,可以再輸入 ip a,這時就會看到 eth0 已經透過 DHCP的方式取得 IP。

手動設定 IP

當然也可以透過手動設定 IP 的方式來設定 IP。

在終端機輸入

su ifconfig eth0 192.168.10.250 netmask 255.255.255.0 up route add default gw 192.168.10.1 dev eth0

#设置IP

root@android:/ # ifconfig eth0 192.168.0.173 netmask 255.255.255.0
ifconfig eth0 192.168.0.173 netmask 255.255.255.0

ifconfig wlan0 192.168.1.119 netmask 255.255.255.0

#添加网关

route add default gw 192.168.1.250 dev wlan0
root@android:/ # route add default gw 192.168.0.1 dev eth0

#設定 DNS Server,接著再設定 DNS Server

setprop net.eth0.dns1 192.168.1.250

setprop net.eth0.dns2 192.168.1.1
root@android:/ # setprop net.eth0.dns1 8.8.8.8

root@android:/ # setprop net.eth0.dns2 8.8.4.4

在終端機輸入

setprop net.dns1 8.8.8.8

設定完後就可以使用內建的瀏覽器上網試試看網路是否有設定成功。

到了這邊,安裝 Android-x86 4.0 的步驟就已經告一段落了,雖然可以上網,但是還是不能設定 Google 帳號,因為 Android-x86 4.0 只認得 WiFi 裝置,所以沒有 WiFi 裝置就會被當成沒有網路連線,希望這個功能可以在之後的版本被修正。

实例手机连接:

转自 http://www.biemmeitalia.net/blog/android-network-configuration/

通过shell命令设置(获取)IP、网关、dns信息,需要获取root权限

查看所有网络信息

C:\>adb shell
root@android:/ # netcfg
netcfg
ip6tnl0  DOWN                                   0.0.0.0/0   0x00000080 00:00:00:
00:00:00
gre0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:
00:00:00
eth0     UP                               192.168.0.180/24  0x00001043 00:00:00:
ec:0a:00
sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:
00:00:00
lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:
00:00:00
tunl0    DOWN                                   0.0.0.0/0   0x00000080 00:00:00:
00:00:00

查看eth0

root@android:/ # ifconfig eth0
ifconfig eth0
eth0: ip 192.168.0.180 mask 255.255.255.0 flags [up broadcast running multicast]

查看dns

root@android:/ # getprop net.eth0.dns1
getprop net.eth0.dns1
8.8.8.8

root@android:/ # getprop net.eth0.dns2
getprop net.eth0.dns2
8.8.4.4

设置ip

root@android:/ # ifconfig eth0 192.168.0.173 netmask 255.255.255.0
ifconfig eth0 192.168.0.173 netmask 255.255.255.0

root@android:/ # ifconfig eth0
ifconfig eth0
eth0: ip 192.168.0.173 mask 255.255.255.0 flags [up broadcast running multicast]

设置网关Gateway

root@android:/ # route add default gw 192.168.0.1 dev eth0
route add default gw 192.168.0.1 dev eth0

添加dns

root@android:/ # setprop net.eth0.dns1 8.8.8.8
setprop net.eth0.dns1 8.8.8.8

root@android:/ # setprop net.eth0.dns2 8.8.4.4
setprop net.eth0.dns2 8.8.4.4

查看eth配置信息

root@android:/ # getprop | grep eth0
getprop | grep eth0
[dhcp.eth0.dns1]: [192.168.0.1]
[dhcp.eth0.dns2]: []
[dhcp.eth0.dns3]: []
[dhcp.eth0.dns4]: []
[dhcp.eth0.gateway]: [192.168.0.1]
[dhcp.eth0.ipaddress]: [192.168.0.180]
[dhcp.eth0.leasetime]: [3600]
[dhcp.eth0.mask]: [255.255.255.0]
[dhcp.eth0.pid]: [13800]
[dhcp.eth0.reason]: [PREINIT]
[dhcp.eth0.result]: [failed]
[dhcp.eth0.server]: [192.168.0.1]
[dhcp.eth0.vendorInfo]: []
[net.change]: [net.eth0.dns2]
[net.eth0.dns1]: [8.8.8.8]
[net.eth0.dns2]: [8.8.4.4]

 

linux 中更改用户权限和用户组的命令

Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

文件或目录的访问权 限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文 件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

  1. $ ls -l sobsrc. tgz
  2. rw-r–r– 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。例如:

– rw- r– r–

普通文件 文件主 组用户 其他用户

是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。

下面分别对这些命令加以介绍。

chmod 命令

chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。

以主文件夹下的一个名为“cc”的文件夹为例。下面一步一步介绍如何修改权限:

1.打开终端。输入”su”(没有引号)

2.接下来会要你输入密码,输入你的root密码。

3.假设我的文件夹在主目录里,地址为  /var/home/dengchao/cc  。假设我要修改文件权限为777,则在终端输入  chmod  777 /var/home/userid/cc 文件夹的权限就变为了777。

如果是修改文件夹及子文件夹权限可以用  chmod -R 777 /var/home/userid/cc

具体的权限(例如777的含意等)在下面解释下:

1.777有3位,最高位7是设置文件所有者访问权限,第二位是设置群组访问权限,最低位是设置其他人访问权限。

其中每一位的权限用数字来表示。具体有这些权限:

  • r(Read,读取,权限值为4):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目 录的权限。
  • w(Write,写入,权限值为2):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
  • x(eXecute,执行,权限值为1):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

2. 首先我们来看如何确定单独一位上的权限数值,例如最高位表示文件所有者权限数值,当数字为7时,7用“rwx”表示 –{4(r)+2(w)+1(x)=7}–又如果数值为6,则用“rw-”表示–{4(r)+2(w)+0(x)=6}–,”-”表示不具备权限,这里表 示不具备“执行”权限。

假如我们设定其他用户的访问权限为 “r–”,则数值为4+0+0=4

一开始许多初学者会被搞糊涂,其实很简单,我们将rwx看成二进制数,如果有则用1表示,没有则有0表示,那么rwx则可以表示成为:111

而二进制的111就是7。

3.我们再来看下怎么确定3个数位上的权限。假如我们要给一个文件设置权限,具体权限如下:

文件所有者有“读”、“写”、“执行”权限,群组用户有“读”权限,其他用户有“读”权限,则对应的字母表示为”rwx r– r–“,对应的数字为744

一般都是最高位表示文件所有者权限值,第二位表示群组用户权限,最低位表示其他用户权限。

下面来举些例子熟悉下。

权限 数值
rwx rw- r– 764
rw- r– r– 644
rw- rw- r– 664

该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

1. 文字设定法

chmod [who] [+ | – | =] [mode] 文件名¼

命令中各选项的含义为:

操作对象who可是下述字母中的任一个或者它们的组合:

  • u 表示“用户(user)”,即文件或目录的所有者。
  • g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
  • o 表示“其他(others)用户”。
  • a 表示“所有(all)用户”。它是系统默认值。

操作符号可以是:

  • + 添加某个权限。
  • – 取消某个权限。
  • = 赋予给定权限并取消其他所有权限(如果有的话)。
  • 设置mode所表示的权限可用下述字母的任意组合:
  • r 可读。
  • w 可写。
  • x 可执行。
  • X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
  • s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
  • t 保存程序的文本到交换设备上。
  • u 与文件属主拥有一样的权限。
  • g 与和文件属主同组的用户拥有一样的权限。
  • o 与其他用户拥有一样的权限。
  • -c : 若该档案权限确实已经更改,才显示其更改动作
  • -f : 若该档案权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

文件名:以空格分开的要改变权限的文件列表,支持通配符。在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example使同组和其他用户对文件example 有读权限。

例1:

  1. $ chmod a+x sort

即设定文件sort的属性为:

文件属主(u) 增加执行权限

与文件属主同组用户(g) 增加执行权限

其他用户(o) 增加执行权限

例2:

  1. $ chmod ug+w,o-x text

即设定文件text的属性为:

文件属主(u) 增加写权限

与文件属主同组用户(g) 增加写权限

其他用户(o) 删除执行权限

例3:

  1. $ chmod u+s a.out

假设执行chmod后a.out的权限为(可以用ls – l a.out命令来看):

  1. rws–x–x 1 inin users 7192 Nov 4 14:22 a.out

并且这个执行文件要用到一个文本文件shiyan1.c,其文件存取权限为“–rw——-”,即该文件只有其属主具有读写权限。

当其他用户执行a.out这个程序时,他的身份因这个程序暂时变成inin(由于chmod命令中使用了s选项),所以他就能够读取shiyan1.c这个文件(虽然这个文件被设定为其他人不具备任何权限),这就是s的功能。

因此,在整个系统中特别是root本身,最好不要过多的设置这种类型的文件(除非必要)这样可以保障系统的安全,避免因为某些程序的bug而使系统遭到入侵。

例4:

  1. $ chmod a–x mm.txt
  2. $ chmod –x mm.txt
  3. $ chmod ugo–x mm.txt

以上这三个命令都是将文件mm.txt的执行权限删除,它设定的对象为所有使用者。

2. 数字设定法

我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。

例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。

数字设定法的一般形式为:chmod [mode] 文件名¼

例1:

  1. $ chmod 644 mm.txt
  2. $ ls –l

即设定文件mm.txt的属性为:

  1. rw-r–r– 1 inin users 1155 Nov 5 11:22 mm.txt

文件属主(u)inin 拥有读、写权限

与文件属主同组人用户(g) 拥有读权限

其他人(o) 拥有读权限

例2:

  1. $ chmod 750 wch.txt
  2. $ ls –l
  3. rwxr-x— 1 inin users 44137 Nov 12 9:22 wchtxt

即设定wchtxt这个文件的属性为:

文件主本人(u)inin 可读/可写/可执行权

与文件主同组人(g) 可读/可执行权

其他人(o) 没有任何权限

chgrp命令

功能:改变文件或目录所属的组。

语法:chgrp [选项] group filename¼

参数:

  • -c或–changes 效果类似”-v”参数,但仅回报更改的部分。
  • -f或–quiet或–silent  不显示错误信息。
  • -h或–no-dereference  只对符号连接的文件作修改,而不更动其他任何相关文件。
  • -R或–recursive  递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v或–verbose  显示指令执行过程。
  • –help  在线帮助。
  • –reference=<参考文件或目录>  把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
  • –version  显示版本信息。

该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。

该命令的各选项含义为:

– R 递归式地改变指定目录及其下的所有子目录和文件的属组。

例1:

  1. chgrp – R book /opt/local /book

改变/opt/local /book/及其子目录下的所有文件的属组为book。

chown 命令

功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户yusi,为了让用户yusi能够存取这个文件,root用户应该把这个文件的属主设为yusi,否则,用户yusi无法存取这个文件。

语法:chown [选项] 用户或组 文件

说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。

参数说明:

  • user : 新的档案拥有者的使用者 ID
  • group : 新的档案拥有者的使用者群体(group)
  • -c : 若该档案拥有者确实已经更改,才显示其更改动作
  • -f : 若该档案拥有者无法被更改也不要显示错误讯息
  • -h : 只对于连结(link)进行变更,而非该 link 真正指向的档案
  • -v : 显示拥有者变更的详细资料
  • -R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)
  • –help : 显示辅助说明
  • –version : 显示版本

例1:把文件yusi123.com的所有者改为yusi。

  1. chown yusi yusi123.com

例2:把目录/demo及其下的所有文件和子目录的属主改成yusi,属组改成users。

  1. $ chown – R yusi.users /demo

例如:chown qq /home/qq  (把home目录下的qq目录的拥有者改为qq用户)

例如:chown -R qq /home/qq  (把home目录下的qq目录下的所有子文件的拥有者改为qq用户)

 

用户组 chgrp -R foldname zdz

chown -R  所有者用户名.组名 文件夹名称
例如:chown -R  zdz.nginx KooBox
root@ali-qss:/var/www# chown -R www-data.www-data html

命令详解直接搜索就很多了,这里不多说了。

================================

chmod命令使用数字修改文件权限

Linux 系统中,文件的基本权限由 9 个字符组成,以 rwxrw-r-x 为例,我们可以使用数字来代表各个权限,各个权限与数字的对应关系如下:

r –> 4
w –> 2
x –> 1

由于这 9 个字符分属 3 类用户,因此每种用户身份包含 3 个权限(r、w、x),通过将 3 个权限对应的数字累加,最终得到的值即可作为每种用户所具有的权限。

拿 rwxrw-r-x 来说,所有者、所属组和其他人分别对应的权限值为:

所有者 = rwx = 4+2+1 = 7
所属组 = rw- = 4+2 = 6
其他人 = r-x = 4+1 = 5

所以,此权限对应的权限值就是 765。

使用数字修改文件权限的 chmod 命令基本格式为:

[root@localhost ~]# chmod [-R] 权限值 文件名

-R(注意是大写)选项表示连同子目录中的所有文件,也都修改设定的权限。

例如,使用如下命令,即可完成对 .bashrc 目录文件的权限修改:

[root@localhost ~]# ls -al .bashrc
-rw-r–r–. 1 root root 176 Sep 22 2004 .bashrc
[root@localhost ~]# chmod 777 .bashrc
[root@localhost ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Sep 22 2004 .bashrc

再举个例子,通常我们以 Vim 编辑 Shell 文件批处理文件后,文件权限通常是 rw-rw-r–(644),那么,如果要将该文件变成可执行文件,并且不让其他人修改此文件,则只需将此文件的权限该为 rwxr-xr-x(755)即可。

chmod命令使用字母修改文件权限

既然文件的基本权限就是 3 种用户身份(所有者、所属组和其他人)搭配 3 种权限(rwx),chmod 命令中用 u、g、o 分别代表 3 种身份,还用 a 表示全部的身份(all 的缩写)。另外,chmod 命令仍使用 r、w、x 分别表示读、写、执行权限。

使用字母修改文件权限的 chmod 命令,其基本格式如图 1 所示。

chmod 命令基本格式
图 1 chmod 命令基本格式

例如,如果我们要设定 .bashrc 文件的权限为 rwxr-xr-x,则可执行如下命令:

[root@localhost ~]# chmod u=rwx,go=rx .bashrc
[root@localhost ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Sep 22 2004 .bashrc

再举个例子,如果想要增加 .bashrc 文件的每种用户都可做写操作的权限,可以使用如下命令:

[root@localhost ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root 176 Sep 22 2004 .bashrc
[root@localhost ~]# chmod a+w .bashrc
[root@localhost ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 Sep 22 2004 .bashrc

增加权限给当前用户 chmod +wx filename

chmod -R 777 /upload

语法:chmod [who] [+ | – | =] [mode] 文件名

命令中各选项的含义为

u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
– 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。

实例

修改文件可读写属性的方法
例如:把index.html 文件修改为可写可读可执行:
chmod 777 index.html

要修改目录下所有文件属性可写可读可执行:
chmod 777 *.*

把文件夹名称与后缀名用*来代替就可以了。
比如:修改所有htm文件的属性:
chmod 777 *.htm

修改文件夹属性的方法
把目录 /images/small 修改为可写可读可执行
chmod 777 /images/small

修改目录下所有的文件夹属性
chmod 777 *

把文件夹名称用*来代替就可以了

要修改文件夹内所有的文件和文件夹及子文件夹属性为可写可读可执行

chmod -R 777 /upload

总结linux下目录和文件的权限区别

文件:读文件内容(r)、写数据到文件(w)、作为命令执行文件(x)。
目录:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录)
具体说就是:
(1)有只读权限的用户不能用cd进入该目录:还必须有执行权限才能进入。
(2)有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件。
(3)必须有读和执行权限才可以ls列出目录清单,或使用cd命令进入目录。
(4)有目录的写权限,可以创建、删除或修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。

查看目录权限

查看文件权限的语句:
在终端输入:
ls -l xxx.xxx (xxx.xxx是文件名)
那么就会出现相类似的信息,主要都是这些:
-rw-rw-r–
一共有10位数
其中: 最前面那个 – 代表的是类型
中间那三个 rw- 代表的是所有者(user)
然后那三个 rw- 代表的是组群(group)
最后那三个 r– 代表的是其他人(other)
然后我再解释一下后面那9位数:
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
– 表示相应的权限还没有被授予
现在该说说修改文件权限了
在终端输入:
chmod o w xxx.xxx
表示给其他人授予写xxx.xxx这个文件的权限
chmod go-rw xxx.xxx
表示删除xxx.xxx中组群和其他人的读和写的权限
其中:
u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)
a 代表全部的人,也就是包括u,g和o
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
其中:rwx也可以用数字来代替
r ————4
w ———–2
x ————1
– ————0
行动:
表示添加权限
– 表示删除权限
= 表示使之成为唯一的权限
当大家都明白了上面的东西之后,那么我们常见的以下的一些权限就很容易都明白了:
-rw——- (600) 只有所有者才有读和写的权限
-rw-r–r– (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
-rwx—— (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx–x–x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw- (666) 每个人都有读写的权限
-rwxrwxrwx (777) 每个人都有读写和执行的权限

chgrp 命令用于修改文件(或目录)的所属组。

为了方便初学者记忆,可以将 chgrp 理解为是 “change group” 的缩写。

chgrp 命令的用法很简单,其基本格式为:

[root@localhost ~]# chgrp [-R] 所属组 文件名(目录名)

-R(注意是大写)选项长作用于更改目录的所属组,表示更改连同子目录中所有文件的所属组信息。

使用此命令需要注意的一点是,要被改变的群组名必须是真实存在的,否则命令无法正确执行,会提示 “invaild group name”。

举个例子,当以 root 身份登录 Linux 系统时,主目录中会存在一个名为 install.log 的文件,我们可以使用如下方法修改此文件的所属组:

[root@localhost ~]# groupadd group1
#新建用于测试的群组 group1
[root@localhost ~]# chgrp group1 install.log
#修改install.log文件的所属组为group1
[root@localhost ~]# ll install.log
-rw-r–r–. 1 root group1 78495 Nov 17 05:54 install.log
#修改生效
[root@localhost ~]# chgrp testgroup install.log
chgrp: invaild group name ‘testgroup’

可以看到,在具有 group1 群组的前提下,我们成功修改了 install.log 文件的所属组,但我们再次试图将所属组修改为 testgroup 时,命令执行失败,就是因为系统的 /etc/group 文件中,没有 testgroup 群组。

WordPress自动采集发布插件WP-AutoPost使用教程

WP-AutoPost中文免费下载地址 http://wp-autopost.org/zh

一、安装WP-AutoPost

和安装其他WordPress插件一样,直接上传到插件目录,激活即可使用,无需再进行额外设置或修改代码。

二、创建采集任务

点击“新建任务”后,输入任务名称,即可创建新任务,创建好新任务之后可以在任务列表中查看到该任务,就可对该任务进行更多设置。

三、基本设置功能

在基本设置选项卡下,可以进行如下设置:

  • 任务名称:可以修改任务名称
  • 分类目录:该任务采集文章发布到的分类目录
  • 作者:该任务采集文章的发布作者,必须是WordPress里的注册用户
  • 更新时间间隔:间隔多长时间检测一次该采集任务下是否有新文章可以更新
  • 字符集:采集目标网站的字符集编码,默认为UTF8,如果目标网页字符集编码不是UTF8,抓取的网页会出现乱码,设置正确的字符集即可解决该问题(如何正确设置字符集
  • 下载远程图片:如果该任务下采集的文章里包含图片,可以选择是否下载远程图片到本地服务器,选择下载远程图片,可进一步选择是否将下载的图片信息保存到WordPress媒体库中
  • 自动标签:选择是否使用自动标签
  • 标签列表:使用自动标签后如果文章包含列表里的关键词,将自动添加标签
  • 匹配完整的单词:该设置对英文文章有效,中文文章请勿启用该设置

四、文章来源设置

在该选项卡下我们需要设置文章来源的 文章列表网址及 具体文章的匹配规则

我们以采集“新浪互联网新闻”为例,文章列表网址为http://roll.tech.sina.com.cn/internet_worldlist/index.shtml 因此在 手工指定文章列表网址 中输入该网址即可,如下所示:

之后需要设置该文章列表网址下具体文章网址的匹配规则

五、文章网址匹配规则

文章网址匹配规则的设置非常简单,无需复杂设置,提供两种匹配模式,可以使用URL通配符匹配,也可以使用CSS选择器进行匹配,通常使用URL通配符匹配较为简单。

1. 使用URL通配符匹配

通过点击列表网址 http://roll.tech.sina.com.cn/internet_worldlist/index.shtml 上的文章,我们可以发现每篇文章的URL都为如下结构

http://tech.sina.com.cn/i/2013-06-27/16328485884.shtml

因此将URL中变化的数字或字母替换为通配符 (*) 即可,如:http://tech.sina.com.cn/i/(*)/(*).shtml

2. 使用CSS选择器进行匹配

使用CSS选择器进行匹配,我们只需要设置 文章网址的CSS选择器 即可(不知道CSS选择器为何物,一分钟学会如何设置CSS选择器),通过查看列表网址 http://roll.tech.sina.com.cn/internet_worldlist/index.shtml 的源代码即可轻松设置,找到该列表网址下具体文章的超链接的代码,如下所示:

可以看到,文章的超链接a标签在class为“contList”的标签内部,因此 文章网址的CSS选择器 只需要设置为 .contList a  即可,如下所示:

设置完成之后,不知道设置是否正确,可以点击上图中的测试按钮,如果设置正确,将列出该列表网址下所有文章名称和对应的网页地址,如下所示:

六、文章抓取设置

在该选项卡下,我们需要设置文章标题和文章内容的匹配规则,提供两种方式进行设置,推荐使用CSS选择器方式,使用该方式更为简单,精确。(不知道CSS选择器为何物,一分钟学会如何设置CSS选择器

我们只需要设置文章标题CSS选择器文章内容CSS选择器,即可准确抓取文章标题和文章内容。

在文章来源设置里,我们以采集”新浪互联网新闻“为例,这里还是以该例子讲解,通过查看列表网址 http://roll.tech.sina.com.cn/internet_worldlist/index.shtml 下某一篇文章的源代码即可轻松设置,例如,我们通过查看某篇具体文章 http://tech.sina.com.cn/n/i/2013-06-10/06308430630.shtml 的源代码,如下所示:

可以看到,文章标题在id为“artibodyTitle”的标签内部,因此文章标题CSS选择器只需要设置为#artibodyTitle 即可;

同样的,找到文章内容的相关代码:

可以看到,文章内容在id为“artibody”的标签内部,因此文章内容CSS选择器只需要设置为 #artibody 即可;如下所示:

设置完成之后,不知道设置是否正确,可点击测试按钮,输入测试地址,如果设置正确,将显示出文章标题和文章内容,方便检查设置

七、抓取文章分页内容

如果文章内容过长,有多个分页同样可以抓取全部内容,这时需要设置文章分页链接CSS选择器,通过查看具体文章网址源代码,找到分页链接的地方,例如某篇文章分页链接代码如下:

可以看到,分页链接A标签在class为 “page-link” 的标签内部

因此,文章分页链接CSS选择器设置为 .page-link a 即可,如下所示:

如果勾选当发表时也分页时,发表文章也将同样被分页,如果你的WordPress主题不支持 <!- – nextpage – -> 标签,请勿勾选。

八、文章内容过滤功能

文章内容过滤功能,可过滤掉正文中不希望发布的内容(如广告代码,版权信息等),可设置两个关键词,删除掉两个关键词之间的内容,关键词2可以为空,表示删除掉关键词1之后的所有内容。

如下所示,我们通过测试抓取文章后发现文章里有不希望发布的内容,切换到HTML显示,找到该内容的HTML代码,分别设置两个关键词即可过滤掉该内容。

如上所示,如果我们希望过滤掉上面<div class=”ep-source cDGray”>和</div>之间的内容,添加如下设置即可

如果需要过滤掉多处内容,可以添加多组设置。

九、HTML标签过滤功能

HTML标签过滤功能,可过滤掉采集文章中的超链接(a标签),<script>和<style>等标签下不必要的代码。

下面是几个例子:

  • 如果需要过滤掉文章中的超链接,只需输入 a 即可,是否删除标签内容 选择否
  • 如果要过滤掉文章中包含的<script>或<style>不必要的代码,只需输入对应标签名称,是否删除标签内容选择是

十、关键词替换、自动添加自定义超链接

可以将正文或标题中的关键词进行替换,同时也支持正文自定义超链接;

例如:需要将文章里的wordpress自动添加链接到http://wordpress.org/,只需设置 wordpress 替换为 <a href=”http://wordpress.org/”>wordpress</a> 即可

如下所示:

十一、解决乱码问题

为什么产生乱码

WP-AutoPost 采集网页时默认字符集为UTF-8,如果目标网页的字符集不是UTF-8,采集的内容可能会出现乱码。

解决乱码问题

解决方法非常简单,只需查看目标网页的字符集,设置正确的字符集即可。

打开目标网页源代码,一般在最前面的位置,找到有charset的代码部分:

如上所示,该网页的目标编码为gb2312,设置相同的字符集即可:

(Service iptables stop/start)关闭/打开防火墙 Failed to stop iptables.service: Unit iptables.service not loaded.

背景: 

测试部署NetCore 项目到linux 系统时,窗口显示项目部署成功;但是本机无法访问(linux 在虚拟机上[ centos 7.6] );  如下图↓

 

 

能够相互ping  通,(Xshell 连接正常。),在centos 上 也能正常访问,后来记起在进行linux   安装成功后,没有关闭防火墙,初步猜测是由于没有关闭防火墙导致,那关闭防火墙不就可以了?

二、操作

1、打开linux 终端,输入:  service  iptables stop   ,就提示 标题展示的异常;

 

 

2、然后输入:systemctl stop firewalld   (暂时关闭防火墙)

查看防火墙状态:systemctl status firewalld

 

 

 

成功了!!!!

三、回顾总结

经过查找发现:在CentOS 7或RHEL 7或Fedora中防火墙由firewalld来管理 ; 如果想要使用 service iptables start/stop 命令,需要下载     iptables-services

1、在 Centos 7 下下载 iptables-services 时,需要执行以下命令

systemctl stop firewalld     –关闭防火墙

      systemctl mask firewalld

yum install iptables-services   –安装iptables-services

       systemctl enable iptables    –设置开机启动

service iptables save       –保存

2、操作linux 防火墙命令:

复制代码
1:查看防火状态
    systemctl status firewalld
    service  iptables status

2:暂时关闭防火墙
    systemctl stop firewalld
    service  iptables stop

3:永久关闭防火墙
    systemctl disable firewalld
    chkconfig iptables off

4:重启防火墙
    systemctl enable firewalld
    service iptables restart  

5:永久关闭后重启(未测试)
    chkconfig iptables on
复制代码

 

查找资料:1、https://www.cnblogs.com/jxldjsn/p/10794171.html

2、https://blog.csdn.net/c233728461/article/details/52679558/

查看Linux服务器中所有正在运行的进程服务

 Linux 中所有正在运行的服务。大多数管理员会在 System V(SysV)初始化系统中使用 service service-name status 或 /etc/init.d/service-name status,而在 systemd 初始化系统中使用 systemctl status service-name。

查看服务进程:ps aux

查看服务cpu利用:top

查看服务对应端口:netstat -nlp

以上命令可以清楚地显示该服务是否在服务器上运行,这也是每个 Linux 管理员都该知道的非常简单和基础的命令。

如果你对系统环境并不熟悉,也不清楚系统在运行哪些服务,你会如何检查?

是的,我们的确有必要这样检查一下。这将有助于我们了解系统上运行了什么服务,以及哪些是必要的、哪些需要被禁用。

init(初始化initialization的简称)是在系统启动期间运行的第一个进程。init 是一个守护进程,它将持续运行直至关机。

大多数 Linux 发行版都使用如下的初始化系统之一:

System V 是更老的初始化系统

Upstart 是一个基于事件的传统的初始化系统的替代品

systemd 是新的初始化系统,它已经被大多数最新的 Linux 发行版所采用

什么是 System V(SysV)

SysV(意即 System V) 初始化系统是早期传统的初始化系统和系统管理器。由于 sysVinit 系统上一些长期悬而未决的问题,大多数最新的发行版都适用于 systemd 系统。

什么是 Upstart 初始化系统

Upstart 是一个基于事件的 /sbin/init 的替代品,它控制在启动时的任务和服务的开始,在关机时停止它们,并在系统运行时监控它们。

它最初是为 Ubuntu 发行版开发的,但其是以适合所有 Linux 发行版的开发为目标的,以替换过时的 System-V 初始化系统。

什么是 systemd

systemd 是一个新的初始化系统以及系统管理器,它已成为大多数 Linux 发行版中非常流行且广泛适应的新的标准初始化系统。systemctl 是一个 systemd 管理工具,它可以帮助我们管理 systemd 系统。

方法一:如何在 System V(SysV)系统中查看运行的服务

以下命令可以帮助我们列出 System V(SysV) 系统中所有正在运行的服务。

如果服务很多,我建议使用文件查看命令,如 less、more 等,以便得到清晰的结果。

service –status-all

service –status-all | more

service –status-all | less

abrt-ccpp hook is installed

abrtd (pid 2131) is running…

abrt-dump-oops is stopped

acpid (pid 1958) is running…

atd (pid 2164) is running…

auditd (pid 1731) is running…

Frequency scaling enabled using ondemand governor

crond (pid 2153) is running…

hald (pid 1967) is running…

htcacheclean is stopped

httpd is stopped

Table: filter

Chain INPUT (policy ACCEPT)

num target prot opt source destination

1 ACCEPT all ::/0 ::/0 state RELATED,ESTABLISHED

2 ACCEPT icmpv6 ::/0 ::/0

3 ACCEPT all ::/0 ::/0

4 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:80

5 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:21

6 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:22

7 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:25

8 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:2082

9 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:2086

10 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:2083

11 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:2087

12 ACCEPT tcp ::/0 ::/0 state NEW tcp dpt:10000

13 REJECT all ::/0 ::/0 reject-with icmp6-adm-prohibited

Chain FORWARD (policy ACCEPT)

num target prot opt source destination

1 REJECT all ::/0 ::/0 reject-with icmp6-adm-prohibited

Chain OUTPUT (policy ACCEPT)

num target prot opt source destination

iptables: Firewall is not running.

irqbalance (pid 1826) is running…

Kdump is operational

lvmetad is stopped

mdmonitor is stopped

messagebus (pid 1929) is running…

SUCCESS! MySQL running (24376)

rndc: neither /etc/rndc.conf nor /etc/rndc.key was found

named is stopped

netconsole module not loaded

Usage: startup.sh { start | stop }

Configured devices:

lo eth0 eth1

Currently active devices:

lo eth0

ntpd is stopped

portreserve (pid 1749) is running…

master (pid 2107) is running…

Process accounting is disabled.

quota_nld is stopped

rdisc is stopped

rngd is stopped

rpcbind (pid 1840) is running…

rsyslogd (pid 1756) is running…

sandbox is stopped

saslauthd is stopped

smartd is stopped

openssh-daemon (pid 9859) is running…

svnserve is stopped

vsftpd (pid 4008) is running…

xinetd (pid 2031) is running…

zabbix_agentd (pid 2150 2149 2148 2147 2146 2140) is running…

执行以下命令,可以只查看正在运行的服务:

service –status-all | grep running

crond (pid 535) is running…

httpd (pid 627) is running…

mysqld (pid 911) is running…

rndc: neither /etc/rndc.conf nor /etc/rndc.key was found

rsyslogd (pid 449) is running…

saslauthd (pid 492) is running…

sendmail (pid 509) is running…

sm-client (pid 519) is running…

openssh-daemon (pid 478) is running…

xinetd (pid 485) is running…

运行以下命令以查看指定服务的状态:

service –status-all | grep httpd

httpd (pid 627) is running…

或者,使用以下命令也可以查看指定服务的状态:

service httpd status

httpd (pid 627) is running…

使用以下命令查看系统启动时哪些服务会被启用:

chkconfig –list

crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off

htcacheclean 0:off 1:off 2:off 3:off 4:off 5:off 6:off

httpd 0:off 1:off 2:off 3:on 4:off 5:off 6:off

ip6tables 0:off 1:off 2:on 3:off 4:on 5:on 6:off

iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off

modules_dep 0:off 1:off 2:on 3:on 4:on 5:on 6:off

mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off

named 0:off 1:off 2:off 3:off 4:off 5:off 6:off

netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off

netfs 0:off 1:off 2:off 3:off 4:on 5:on 6:off

network 0:off 1:off 2:on 3:on 4:on 5:on 6:off

nmb 0:off 1:off 2:off 3:off 4:off 5:off 6:off

nscd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

portreserve 0:off 1:off 2:on 3:off 4:on 5:on 6:off

quota_nld 0:off 1:off 2:off 3:off 4:off 5:off 6:off

rdisc 0:off 1:off 2:off 3:off 4:off 5:off 6:off

restorecond 0:off 1:off 2:off 3:off 4:off 5:off 6:off

rpcbind 0:off 1:off 2:on 3:off 4:on 5:on 6:off

rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off

saslauthd 0:off 1:off 2:off 3:on 4:off 5:off 6:off

sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off

smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off

snmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

snmptrapd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

udev-post 0:off 1:on 2:on 3:off 4:on 5:on 6:off

winbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off

xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off

xinetd based services:

chargen-dgram: off

chargen-stream: off

daytime-dgram: off

daytime-stream: off

discard-dgram: off

discard-stream: off

echo-dgram: off

echo-stream: off

finger: off

ntalk: off

rsync: off

talk: off

tcpmux-server: off

time-dgram: off

time-stream: off

方法二:如何在 System V(SysV)系统中查看运行的服务

另外一种在 Linux 系统上列出运行的服务的方法是使用 initctl 命令:

initctl list

rc stop/waiting

tty (/dev/tty3) start/running, process 1740

tty (/dev/tty2) start/running, process 1738

tty (/dev/tty1) start/running, process 1736

tty (/dev/tty6) start/running, process 1746

tty (/dev/tty5) start/running, process 1744

tty (/dev/tty4) start/running, process 1742

plymouth-shutdown stop/waiting

control-alt-delete stop/waiting

rcS-emergency stop/waiting

readahead-collector stop/waiting

kexec-disable stop/waiting

quit-plymouth stop/waiting

rcS stop/waiting

prefdm stop/waiting

init-system-dbus stop/waiting

ck-log-system-restart stop/waiting

readahead stop/waiting

ck-log-system-start stop/waiting

splash-manager stop/waiting

start-ttys stop/waiting

readahead-disable-services stop/waiting

ck-log-system-stop stop/waiting

rcS-sulogin stop/waiting

serial stop/waiting

方法三:如何在 systemd 系统中查看运行的服务

以下命令帮助我们列出 systemd 系统中所有服务:

systemctl

UNIT LOAD ACTIVE SUB DESCRIPTION

sys-devices-virtual-block-loop0.device loaded active plugged /sys/devices/virtual/block/loop0

sys-devices-virtual-block-loop1.device loaded active plugged /sys/devices/virtual/block/loop1

sys-devices-virtual-block-loop2.device loaded active plugged /sys/devices/virtual/block/loop2

sys-devices-virtual-block-loop3.device loaded active plugged /sys/devices/virtual/block/loop3

sys-devices-virtual-block-loop4.device loaded active plugged /sys/devices/virtual/block/loop4

sys-devices-virtual-misc-rfkill.device loaded active plugged /sys/devices/virtual/misc/rfkill

sys-devices-virtual-tty-ttyprintk.device loaded active plugged /sys/devices/virtual/tty/ttyprintk

sys-module-fuse.device loaded active plugged /sys/module/fuse

sys-subsystem-net-devices-enp0s3.device loaded active plugged 82540EM Gigabit Ethernet Controller (PRO/1000 MT Desktop Adapter)

-.mount loaded active mounted Root Mount

dev-hugepages.mount loaded active mounted Huge Pages File System

dev-mqueue.mount loaded active mounted POSIX Message Queue File System

run-user-1000-gvfs.mount loaded active mounted /run/user/1000/gvfs

run-user-1000.mount loaded active mounted /run/user/1000

snap-core-3887.mount loaded active mounted Mount unit for core

snap-core-4017.mount loaded active mounted Mount unit for core

snap-core-4110.mount loaded active mounted Mount unit for core

snap-gping-13.mount loaded active mounted Mount unit for gping

snap-termiusx2dapp-8.mount loaded active mounted Mount unit for termius-app

sys-fs-fuse-connections.mount loaded active mounted FUSE Control File System

sys-kernel-debug.mount loaded active mounted Debug File System

acpid.path loaded active running ACPI Events Check

cups.path loaded active running CUPS Scheduler

systemd-ask-password-plymouth.path loaded active waiting Forward Password Requests to Plymouth Directory Watch

systemd-ask-password-wall.path loaded active waiting Forward Password Requests to Wall Directory Watch

init.scope loaded active running System and Service Manager

session-c2.scope loaded active running Session c2 of user magi

accounts-daemon.service loaded active running Accounts Service

acpid.service loaded active running ACPI event daemon

anacron.service loaded active running Run anacron jobs

apache2.service loaded active running The Apache HTTP Server

apparmor.service loaded active exited AppArmor initialization

apport.service loaded active exited LSB: automatic crash report generation

aptik-battery-monitor.service loaded active running LSB: start/stop the aptik battery monitor daemon

atop.service loaded active running Atop advanced performance monitor

atopacct.service loaded active running Atop process accounting daemon

avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack

colord.service loaded active running Manage, Install and Generate Color Profiles

console-setup.service loaded active exited Set console font and keymap

cron.service loaded active running Regular background program processing daemon

cups-browsed.service loaded active running Make remote CUPS printers available locally

cups.service loaded active running CUPS Scheduler

dbus.service loaded active running D-Bus System Message Bus

postfix.service loaded active exited Postfix Mail Transport Agent

UNIT 相应的 systemd 单元名称

LOAD 相应的单元是否被加载到内存中

ACTIVE 该单元是否处于活动状态

SUB 该单元是否处于运行状态(LCTT 译注:是较于 ACTIVE 更加详细的状态描述,不同的单元类型有不同的状态。)

DESCRIPTION 关于该单元的简短描述

以下选项可根据类型列出单元:

systemctl list-units –type service

UNIT LOAD ACTIVE SUB DESCRIPTION

accounts-daemon.service loaded active running Accounts Service

acpid.service loaded active running ACPI event daemon

anacron.service loaded active running Run anacron jobs

apache2.service loaded active running The Apache HTTP Server

apparmor.service loaded active exited AppArmor initialization

apport.service loaded active exited LSB: automatic crash report generation

aptik-battery-monitor.service loaded active running LSB: start/stop the aptik battery monitor daemon

atop.service loaded active running Atop advanced performance monitor

atopacct.service loaded active running Atop process accounting daemon

avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack

colord.service loaded active running Manage, Install and Generate Color Profiles

console-setup.service loaded active exited Set console font and keymap

cron.service loaded active running Regular background program processing daemon

cups-browsed.service loaded active running Make remote CUPS printers available locally

cups.service loaded active running CUPS Scheduler

dbus.service loaded active running D-Bus System Message Bus

fwupd.service loaded active running Firmware update daemon

getty@tty1.service loaded active running Getty on tty1

grub-common.service loaded active exited LSB: Record successful boot for GRUB

irqbalance.service loaded active running LSB: daemon to balance interrupts for SMP systems

keyboard-setup.service loaded active exited Set the console keyboard layout

kmod-static-nodes.service loaded active exited Create list of required static device nodes for the current kernel

以下选项可帮助您根据状态列出单位,输出与前例类似但更直截了当:

systemctl list-unit-files –type service

UNIT FILE STATE

accounts-daemon.service enabled

acpid.service disabled

alsa-restore.service static

alsa-state.service static

alsa-utils.service masked

anacron-resume.service enabled

anacron.service enabled

apache-htcacheclean.service disabled

apache-htcacheclean@.service disabled

apache2.service enabled

apache2@.service disabled

apparmor.service enabled

apport-forward@.service static

apport.service generated

apt-daily-upgrade.service static

apt-daily.service static

aptik-battery-monitor.service generated

atop.service enabled

atopacct.service enabled

autovt@.service enabled

avahi-daemon.service enabled

bluetooth.service enabled

运行以下命令以查看指定服务的状态:

systemctl | grep apache2

apache2.service loaded active running The Apache HTTP Server

或者,使用以下命令也可查看指定服务的状态:

systemctl status apache2

● apache2.service – The Apache HTTP Server

Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)

Drop-In: /lib/systemd/system/apache2.service.d

└─apache2-systemd.conf

Active: active (running) since Tue 2018-03-06 12:34:09 IST; 8min ago

Process: 2786 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)

Main PID: 1171 (apache2)

Tasks: 55 (limit: 4915)

CGroup: /system.slice/apache2.service

├─1171 /usr/sbin/apache2 -k start

├─2790 /usr/sbin/apache2 -k start

└─2791 /usr/sbin/apache2 -k start

Mar 06 12:34:08 magi-VirtualBox systemd[1]: Starting The Apache HTTP Server…

Mar 06 12:34:09 magi-VirtualBox apachectl[1089]: AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 10.0.2.15. Set the ‘ServerName’ directive globally to suppre

Mar 06 12:34:09 magi-VirtualBox systemd[1]: Started The Apache HTTP Server.

Mar 06 12:39:10 magi-VirtualBox systemd[1]: Reloading The Apache HTTP Server.

Mar 06 12:39:10 magi-VirtualBox apachectl[2786]: AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using fe80::7929:4ed1:279f:4d65. Set the ‘ServerName’ directive gl

Mar 06 12:39:10 magi-VirtualBox systemd[1]: Reloaded The Apache HTTP Server.

执行以下命令,只查看正在运行的服务:

systemctl | grep running

acpid.path loaded active running ACPI Events Check

cups.path loaded active running CUPS Scheduler

init.scope loaded active running System and Service Manager

session-c2.scope loaded active running Session c2 of user magi

accounts-daemon.service loaded active running Accounts Service

acpid.service loaded active running ACPI event daemon

apache2.service loaded active running The Apache HTTP Server

aptik-battery-monitor.service loaded active running LSB: start/stop the aptik battery monitor daemon

atop.service loaded active running Atop advanced performance monitor

atopacct.service loaded active running Atop process accounting daemon

avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack

colord.service loaded active running Manage, Install and Generate Color Profiles

cron.service loaded active running Regular background program processing daemon

cups-browsed.service loaded active running Make remote CUPS printers available locally

cups.service loaded active running CUPS Scheduler

dbus.service loaded active running D-Bus System Message Bus

fwupd.service loaded active running Firmware update daemon

getty@tty1.service loaded active running Getty on tty1

irqbalance.service loaded active running LSB: daemon to balance interrupts for SMP systems

lightdm.service loaded active running Light Display Manager

ModemManager.service loaded active running Modem Manager

NetworkManager.service loaded active running Network Manager

polkit.service loaded active running Authorization Manager

使用以下命令查看系统启动时会被启用的服务列表:

systemctl list-unit-files | grep enabled

acpid.path enabled

cups.path enabled

accounts-daemon.service enabled

anacron-resume.service enabled

anacron.service enabled

apache2.service enabled

apparmor.service enabled

atop.service enabled

atopacct.service enabled

autovt@.service enabled

avahi-daemon.service enabled

bluetooth.service enabled

console-setup.service enabled

cron.service enabled

cups-browsed.service enabled

cups.service enabled

display-manager.service enabled

dns-clean.service enabled

friendly-recovery.service enabled

getty@.service enabled

gpu-manager.service enabled

keyboard-setup.service enabled

lightdm.service enabled

ModemManager.service enabled

network-manager.service enabled

networking.service enabled

NetworkManager-dispatcher.service enabled

NetworkManager-wait-online.service enabled

NetworkManager.service enabled

systemd-cgtop 按资源使用情况(任务、CPU、内存、输入和输出)列出控制组:

systemd-cgtop

Control Group Tasks %CPU Memory Input/s Output/s

/ – – 1.5G – –

/init.scope 1 – – – –

/system.slice 153 – – – –

/system.slice/ModemManager.service 3 – – – –

/system.slice/NetworkManager.service 4 – – – –

/system.slice/accounts-daemon.service 3 – – – –

/system.slice/acpid.service 1 – – – –

/system.slice/apache2.service 55 – – – –

/system.slice/aptik-battery-monitor.service 1 – – – –

/system.slice/atop.service 1 – – – –

/system.slice/atopacct.service 1 – – – –

/system.slice/avahi-daemon.service 2 – – – –

/system.slice/colord.service 3 – – – –

/system.slice/cron.service 1 – – – –

/system.slice/cups-browsed.service 3 – – – –

/system.slice/cups.service 2 – – – –

/system.slice/dbus.service 6 – – – –

/system.slice/fwupd.service 5 – – – –

/system.slice/irqbalance.service 1 – – – –

/system.slice/lightdm.service 7 – – – –

/system.slice/polkit.service 3 – – – –

/system.slice/repowerd.service 14 – – – –

/system.slice/rsyslog.service 4 – – – –

/system.slice/rtkit-daemon.service 3 – – – –

/system.slice/snapd.service 8 – – – –

/system.slice/system-getty.slice 1 – – – –

同时,我们可以使用 pstree 命令(输出来自 SysVinit 系统)查看正在运行的服务:

pstree

init-+-crond

|-httpd—2*[httpd]

|-kthreadd/99149—khelper/99149

|-2*[mingetty]

|-mysqld_safe—mysqld—9*[{mysqld}]

|-rsyslogd—3*[{rsyslogd}]

|-saslauthd—saslauthd

|-2*[sendmail]

|-sshd—sshd—bash—pstree

|-udevd

`-xinetd

我们还可以使用 pstree 命令(输出来自 systemd 系统)查看正在运行的服务:

pstree

systemd─┬─ModemManager─┬─{gdbus}

│ └─{gmain}

├─NetworkManager─┬─dhclient

│ ├─{gdbus}

│ └─{gmain}

├─accounts-daemon─┬─{gdbus}

│ └─{gmain}

├─acpid

├─agetty

├─anacron

├─apache2───2[apache2───26[{apache2}]]

├─aptd───{gmain}

├─aptik-battery-m

├─atop

├─atopacctd

├─avahi-daemon───avahi-daemon

├─colord─┬─{gdbus}

│ └─{gmain}

├─cron

├─cups-browsed─┬─{gdbus}

│ └─{gmain}

├─cupsd

├─dbus-daemon

├─fwupd─┬─{GUsbEventThread}

│ ├─{fwupd}

│ ├─{gdbus}

│ └─{gmain}

├─gnome-keyring-d─┬─{gdbus}

│ ├─{gmain}

│ └─{timer}

linux自动备份文件 并上传到远程服务器 脚本实现

      mkdir -p /backup/bakdata  #新建数据备份目录
(2)完成备份脚本操作
新建脚本文件
vi bakdata.sh
添加以下内容:

#!/bin/sh
dateTime=`date +%Y_%m_%d`    #当前系统时间
days=7    #删除7天前的备份数据s
orowner=bakuser   # 备份到此用户下
bakdescdir=/DATA/bakmdata     #备份文件到该路径
bakdata=$orowner”_”$dateTime.tar.gz   #备份文件名
baklog=$orowner”_”$dateTime.log    #备份日志
baksrcdir=/DATA/www/moodledata   #需要备份的文件
remotePath=/DATA/moodle/bakmooldedata   #远程服务器的路径

cd $bakdescdir    #进入备份目录
mkdir -p $orowner   #按需要备份的用户创建目录
cd $orowner   #进入目录
echo “backup start at $dateTime” > $baklog
echo “————————–” >>$baklog
tar -zcvf $bakdata $baksrcdir $baklog    #压缩备份文件和日志文件

find $bakdescdir/$orowner -type f -name “*.log” -exec rm {} \;   #删除日志文件
find $bakdescdir/$orowner -type f -name “*.tar.gz” -mtime +$days -exec  rm -rf {} \;#删除7天前的备份(注意:{} \中间有空格)
scp  $bakdescdir/$orowner/$bakdata 10.6.108.79:$remotePath  #上传到远程服务器
(3)添加脚本执行权限
chmod +x /backup/oracledata/ordatabak.sh

  #添加脚本执行权限
(4)编辑系统任务执行计划
crontab -e
输入一下信息“:

00 01 * * * /DATA/bakdata/bakdata.sh#每天凌晨1点,以oracle用户执行ordatabak.sh备份文件:wq! #保存退出

重启crontab

service crond restart

从此每天的凌晨1点 系统会自动完成数据库的备份,压缩,并上传到远程服务器的指定路径下

Linux定时任务Crontab命令详解

linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。

一、crond简介

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

前 四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行 命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

使用者权限文件:

文件:

/etc/cron.deny

说明:

该文件中所列用户不允许使用crontab命令

文件:

/etc/cron.allow

说明:

该文件中所列用户允许使用crontab命令

文件:

/var/spool/cron/

说明:

所有用户crontab文件存放的目录,以用户名命名

crontab文件的含义:

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

二、crond服务

安装crontab:

yum install crontabs

服务操作说明:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

/sbin/service crond status //启动服务

查看crontab服务是否已设置为开机启动,执行命令:

ntsysv

加入开机自动启动:

chkconfig –level 35 crond on

三、crontab命令详解

1.命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

2.命令功能:

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。

3.命令参数:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

4.常用方法:

1). 创建一个新的crontab文件

在 考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑 crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其 中加入这样一行:

EDITOR=vi; export EDITOR

然后保存并退出。不妨创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入如下的内容。

# (put your own initials here)echo the date to the console every

# 15minutes between 6pm and 6am

0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console

保存并退出。确信前面5个域用空格分隔。

在 上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些 系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为 cron命令的参数:

$ crontab davecron

现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。

同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

2). 列出crontab文件

为了列出crontab文件,可以用:

$ crontab -l

0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:

$ crontab -l > $HOME/mycron

这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

3). 编辑crontab文件

如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:

$ crontab -e

可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

$ crontab -l

# (crondave installed on Tue May 4 13:07:43 1999)

# DT:ech the date to the console every 30 minites

0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

4). 删除crontab文件

要删除crontab文件,可以用:

$ crontab -r

5). 恢复丢失的crontab文件

如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:

$ crontab <filename>

其中,<filename>是你在$ H O M E目录中副本的文件名。

我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。

5.使用实例

实例1:每1分钟执行一次command
命令:
* * * * * command

实例2:每小时的第3和第15分钟执行
命令:
3,15 * * * * command

实例3:在上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 * * * command

实例4:每隔两天的上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 */2 * * command

实例5:每个星期一的上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 * * 1 command

实例6:每晚的21:30重启smb
命令:
30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb
命令:
45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
命令:
0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb
命令:
0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb
命令:
* */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb
命令:
* 23-7/1 * * * /etc/init.d/smb restart

实例13:每月的4号与每周一到周三的11点重启smb
命令:
0 11 4 * mon-wed /etc/init.d/smb restart

实例14:一月一号的4点重启smb
命令:
0 4 1 jan * /etc/init.d/smb restart

实例15:每小时执行/etc/cron.hourly目录内的脚本
命令:
01 * * * * root run-parts /etc/cron.hourly
说明:
run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

四、使用注意事项

注意环境变量问题
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径;

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度
系 统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

其他注意事项
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。

在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。

*实例笔记:个简单的自动备份脚本

以下是脚本test.sh的内容

#!/bin/bash

FILENAME=`date +%Y%m%d`

tar -zcvf /backup/$FILENAME /home/user

然后设置cronjob

命令 crontab -e 

添加一行以下数据 表示每天20点1分执行一次脚本。

1 20 * * * /bin/test.sh  

/*test最好是加上绝对路径,这样不容易出错*/

test.sh放在目录/bin 下面

*TAR 实现 Linux 操作系统自动备份

Tar 命令工具除了用于日常打包、解压源码包或者压缩包之外,最大的亮点是还可以用于 Linux 操作系统文件及目录的备份,使用 tar -g 可以基于 GNU 格式的增量备份,备份原理是基于检查目录或者文件的 atime、mtime、ctime 属性是否被修改。文件及目录时间属性详解如下:
❑ 文件被访问的时间(Access time,atime);
❑ 文件内容被改变的时间(Modified time,mtime);
❑ 文件写入、权限更改的时间(Change time,ctime)。
总结,更改文件内容 mtime 和 ctime 都会改变,但 ctime 可以在 mtime 未发生变化时被更改,例如修改文件权限,文件 mtime 时间不变,而 ctime 时间改变。
TAR 增量备份案例演示步骤如下:

  1. /root 目录创建 test 文件夹,同时在 test 文件夹中,新建test1.txt,test2.txt 文件,如图所示:
[root@hecs-x-medium-2-linux-20200611091300 ~]# cd /root
[root@hecs-x-medium-2-linux-20200611091300 ~]# ls
[root@hecs-x-medium-2-linux-20200611091300 ~]# mkdir test
[root@hecs-x-medium-2-linux-20200611091300 ~]# cd test/
[root@hecs-x-medium-2-linux-20200611091300 test]# touch test1.txt test2.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 使用 tar 命令第一次完整备份 test 文件夹中的内容,-g 指定快照 snapshot文件,第一次没有该文件则会自动创建,如图所示
[root@hecs-x-medium-2-linux-20200611091300 test]# pwd
/root/test
[root@hecs-x-medium-2-linux-20200611091300 test]# tar -g /data/backup/snapshot -czvf /data/backup/2020test.tar.gz *
test1.txt
test2.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# cat /data/backup/snapshot
GNU tar-1.26-2
1592364124756978502[root@hecs-x-medium-2-linux-20200611091300 test]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 使用 tar 命令第一次完整备份 test文件夹中之后,会生成快照文件:/data/backup/snapshot,后期增量备份会以 snapshot 文件为参考,在 test文件夹中再创建 test3.txt test4.txt 文件,然后通过 tar 命令增量备份 test目录所有内容,如图所示:
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# pwd
/root/test
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# touch test3.txt test4.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt  test3.txt  test4.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# tar -g /data/backup/snapshot -czvf /data/backup/2020test_add1.tar.gz *
test3.txt
test4.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

如上图 所示,增量备份时,需-g 指定第一次完整备份的快照 snapshot 文件,同时增量打包的文件名不能跟第一次备份后的文件名重复,通过 tar –tf 可以查看打包后的文件内容

[root@hecs-x-medium-2-linux-20200611091300 test]# tar -tf /data/backup/2020test_add1.tar.gz
test3.txt
test4.txt

  • 1
  • 2
  • 3
  • 4

在test4.txt文件中插入一部分内容,再新建test5.txt文件,修改test1.txt文件权限,再进行一次增量备份

[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt  test3.txt  test4.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# vi test4.txt ##插入内容
[root@hecs-x-medium-2-linux-20200611091300 test]# touch test5.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# ls
test1.txt  test2.txt  test3.txt  test4.txt  test5.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# cat test3.txt 
[root@hecs-x-medium-2-linux-20200611091300 test]# chmod 777 test1.txt ##修改权限
[root@hecs-x-medium-2-linux-20200611091300 test]# tar -g /data/backup/snapshot -czvf /data/backup/2020test_add2.tar.gz *
test4.txt
test5.txt
test1.txt
[root@hecs-x-medium-2-linux-20200611091300 test]# tar -tf /data/backup/2020test_add2.tar.gz
test4.txt
test5.txt
test1.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Shell+TAR 实现增量备份

企业中日常备份的数据包括/boot、/etc、/root、/data 目录等,备份的策略参考:每周 1-6 执行增量备份,每周日执行全备份。同时在企业中备份操作系统数据均使用Shell 脚本完成,此处auto_backup.sh 脚本供参考

#!/bin/sh
#define
SOURCE_DIR=(
    $*
)
TARGET_DIR=/data/backup/
YEAR=`date +%Y`
MONTH=`date +%m`
DAY=`date +%d`
WEEK=`date +%u`
FILES=system_backup.tgz
CODE=$?
if
    [ -z "$*" ];then
    echo -e "Please Enter Your Backup Files or Directories\n--------------------------------------------\nExample $0 /boot /etc ......"
    exit
fi
#Determine Whether the Target Directory Exists
if
    [ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then
    mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY
    echo "This $TARGET_DIR is Created Successfully !"
fi
#EXEC Full_Backup Function Command
Full_Backup()
{
if
    [ "$WEEK" -eq "7" ];then
    rm -rf $TARGET_DIR/snapshot
    cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
    [ "$CODE" == "0" ]&&echo -e  "--------------------------------------------\nThese Full_Backup System Files Backup Successfully !"
fi
}
#Perform incremental BACKUP Function Command
Add_Backup()
{
   cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;
if
    [ -f $TARGET_DIR/$YEAR/$MONTH/$DAY/$FILES ];then
    read -p "These $FILES Already Exists, overwrite confirmation yes or no ? : " SURE
    if [ $SURE == "no" -o $SURE == "n" ];then
    sleep 1 ;exit 0
    fi
#Add_Backup Files System
    if
        [ $WEEK -ne "7" ];then
        cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $$_$FILES `echo ${SOURCE_DIR[@]}`
        [ "$CODE" == "0" ]&&echo -e  "-----------------------------------------\nThese Add_Backup System Files Backup Successfully !"
   fi
else
   if
      [ $WEEK -ne "7" ];then
      cd $TARGET_DIR/$YEAR/$MONTH/$DAY ;tar -g $TARGET_DIR/snapshot -czvf $FILES `echo ${SOURCE_DIR[@]}`
      [ "$CODE" == "0" ]&&echo -e  "-------------------------------------------\nThese Add_Backup System Files Backup Successfully !"
   fi
fi
}
Full_Backup;Add_Backup
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

增加到定时任务中执行

crontab -e
0 1 * * * /bin/sh /data/sh/auto_backup.sh /boot /etc/ >> /tmp/back.log 2>&1

 

linux中tar命令的用法

1.命令格式:

tar[必要参数][选择参数][文件]

2.命令功能:

用来压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的

3.命令参数:

必要参数有如下:

-A 新增压缩文件到已存在的压缩

-B 设置区块大小

-c 建立新的压缩文件

-d 记录文件的差别

-r 添加文件到已经压缩的文件

-u 添加改变了和现有的文件到已经存在的压缩文件

-x 从压缩的文件中提取文件

-t 显示压缩文件的内容

-z 支持gzip解压文件

-j 支持bzip2解压文件

-Z 支持compress解压文件

-v 显示操作过程

-l 文件系统边界设置

-k 保留原有文件不覆盖

-m 保留文件不被覆盖

-W 确认压缩文件的正确性

可选参数如下:

-b 设置区块数目

-C 切换到指定目录

-f 指定压缩文件

–help 显示帮助信息

–version 显示版本信息

4.常见解压/压缩命令

tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName

(注:tar是打包,不是压缩!)

.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName

.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName

.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知

.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
.Z
解压:uncompress FileName.Z
压缩:compress FileName

.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName

.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName

 

5.使用实例

实例1:将文件全部打包成tar包

命令:

输出:

说明:

tar -cvf log.tar log2012.log    仅打包,不压缩!

tar -zcvf log.tar.gz log2012.log   打包后,以 gzip 压缩
tar -zcvf log.tar.bz2 log2012.log  打包后,以 bzip2 压缩

在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar包; 如果加 j 参数,则以 .tar.bz2 来作为tar包名。

实例2:查阅上述 tar包内有哪些文件

命令:

tar -ztvf log.tar.gz

输出:

说明:

由于我们使用 gzip 压缩的log.tar.gz,所以要查阅log.tar.gz包内的文件时,就得要加上 z 这个参数了。

实例3:将tar 包解压缩

命令:

tar -zxvf /opt/soft/test/log.tar.gz

输出:


说明:

在预设的情况下,我们可以将压缩档在任何地方解开的

实例4:只将 /tar 内的 部分文件解压出来

命令:


输出:

说明:

我可以透过 tar -ztvf 来查阅 tar 包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件!

实例5:文件备份下来,并且保存其权限

命令:

复制代码

代码如下:

tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log

输出:

复制代码

代码如下:

[root@localhost test]# ll
总计 0
-rw-r–r– 1 root root 0 11-13 06:03 log2014.log
-rw-r–r– 1 root root 0 11-13 06:06 log2015.log
-rw-r–r– 1 root root 0 11-16 14:41 log2016.log
[root@localhost test]# tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log
log2014.log
log2015.log
log2016.log
[root@localhost test]# cd test6
[root@localhost test6]# ll
[root@localhost test6]# tar -zxvpf /opt/soft/test/log31.tar.gz
log2014.log
log2015.log
log2016.log
[root@localhost test6]# ll
总计 0
-rw-r–r– 1 root root 0 11-13 06:03 log2014.log
-rw-r–r– 1 root root 0 11-13 06:06 log2015.log
-rw-r–r– 1 root root 0 11-16 14:41 log2016.log
[root@localhost test6]#

说明:

这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时

实例6:在 文件夹当中,比某个日期新的文件才备份

命令:

复制代码

代码如下:

tar -N “2012/11/13” -zcvf log17.tar.gz test

输出:

复制代码

代码如下:

[root@localhost soft]# tar -N “2012/11/13” -zcvf log17.tar.gz test
tar: Treating date `2012/11/13′ as 2012-11-13 00:00:00 + 0 nanoseconds
test/test/log31.tar.gz
test/log2014.log
test/linklog.log
test/log2015.log
test/log2013.log
test/log2012.log
test/log2017.log
test/log2016.log
test/log30.tar.gz
test/log.tar
test/log.tar.bz2
test/log.tar.gz

说明:

实例7:备份文件夹内容是排除部分文件

命令:

复制代码

代码如下:

tar –exclude scf/service -zcvf scf.tar.gz scf/*

输出:

复制代码

代码如下:

[root@localhost test]# tree scf
scf
|– bin
|– doc
|– lib
`– service
`– deploy
|– info
`– product
7 directories, 0 files
[root@localhost test]# tar –exclude scf/service -zcvf scf.tar.gz scf/*
scf/bin/
scf/doc/
scf/lib/
[root@localhost test]#</p> <p>

【实例】

1.将文件解压到指定目录下

命令:tar zxvf test.tgz -C 指定目录

如:tar zxvf /usr/local/jdk-8u161-linux-x64.tar.gz -C /usr/local/jdk1.8

将压缩文件jdk-8u161-linux-x64.tar.gz解压到/usr/local/jdk1.8目录下

tar -cvf test.tar.gz test #查看test.tar.gz包中内容;
tar -rf test.tar.gz test.txt #将test.txt文件追加到test.tar.gz 中
tar -xvf test.tar.gz #解压test.tar.gz程序包;
tar -czvf test.tar.gz test #使用gzip 格 式打 包并 压 缩test目录;
tar -cjvf test.tar.bz2 test #使用bzip2格式打包并压缩test目录;
tar -czf test.tar.gz * -X list.txt #使用 gzip 格式打包并压当前目录所有文件,排除list.txt 中记录的文件;
tar -czf test.tar.gz * –exclude=zabbix-3.2.4.tar.gz –exclude=nginx-1.12.0.tar.gz #使用gzip格式打包并压当前目录所有文件及目录,排除 zabbix-3.2.4.tar.gz 和 nginx-1.12.0.tar.gz 软件包。

linux sed命令详解

sed是一种流编辑器,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等。

sed的选项、命令、替换标记

命令格式

sed的命令格式:sed [options] 'command' file(s);
sed的脚本格式:sed [options] -f scriptfile file(s);

选项

 -e :直接在命令行模式上进行sed动作编辑,此为默认选项;
 -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
 -i :直接修改文件内容;
 -n :只打印模式匹配的行;
 -r :支持扩展表达式;
 -h或--help:显示帮助;
 -V或--version:显示版本信息。

参数

文件:指定待处理的文本文件列表。

sed常用命令

 a\ 在当前行下面插入文本;
 i\ 在当前行上面插入文本;
 c\ 把选定的行改为新的文本;
 d 删除,删除选择的行;
 D 删除模板块的第一行;
 s 替换指定字符;
 h 拷贝模板块的内容到内存中的缓冲区;
 H 追加模板块的内容到内存中的缓冲区;
 g 获得内存缓冲区的内容,并替代当前模板块中的文本;
 G 获得内存缓冲区的内容,并追加到当前模板块文本的后面;
 l 列表不能打印字符的清单;
 n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
 N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;
 p 打印模板块的行。 P(大写) 打印模板块的第一行;
 q 退出Sed;
 b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;
 r file 从file中读行;
 t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;
 T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;
 w file 写并追加模板块到file末尾;
 W file 写并追加模板块的第一行到file末尾;
 ! 表示后面的命令对所有没有被选定的行发生作用;
 = 打印当前行号;
 # 把注释扩展到下一个换行符以前;

sed替换标记

 g 表示行内全面替换;
 p 表示打印行;
 w 表示把行写入一个文件;
 x 表示互换模板块中的文本和缓冲区中的文本;
 y 表示把一个字符翻译为另外的字符(但是不用于正则表达式);
 
 \1 子串匹配标记;
 & 已匹配字符串标记;

sed元字符集

 ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;
 
 $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行;
 
 . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;
 
 * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行;
  
 [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;
   
 [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;
  
 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers;
  
 & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**;
  
 \< 匹配单词的开始,如:/\ 
 \> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行;
 
 x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行;
 
 x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行;
 
 x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行;
sed用户实例

替换操作:s命令

替换文本中的字符串:

 sed 's/book/books/' file

-n选项p命令一起使用表示只打印那些发生替换的行:

 sed -n 's/test/TEST/p' file

直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books

 sed -i 's/book/books/g' file

全面替换标记g

使用后缀 /g 标记会替换每一行中的所有匹配:

 sed 's/book/books/g' file

当需要从第N处匹配开始替换时,可以使用 /Ng:

 echo sksksksksksk | sed 's/sk/SK/2g' 
 skSKSKSKSKSK
 echo sksksksksksk | sed 's/sk/SK/3g'
 skskSKSKSKSK  
 echo sksksksksksk | sed 's/sk/SK/4g'
 skskskSKSKSK 

定界符

以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符

 sed 's:test:TEXT:g' 
 sed 's|test|TEXT|g'

定界符出现在样式内部时,需要进行转义:

 sed 's/\/bin/\/usr\/local\/bin/g'

删除操作:d命令

删除空白行:

 sed '/^$/d' file

删除文件的第2行:

 sed '2d' file

删除文件的第2行到末尾所有行:

 sed '2,$d' file

删除文件最后一行:

 sed '$d' file

删除文件中所有开头是test的行:

 sed '/^test/'d file

已匹配字符串标记&

正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:

 echo this is a test line | sed 's/\w\+/[&]/g'
 [this] [is] [a] [test] [line]

所有以192.168.0.1开头的行都会被替换成它自已加localhost:

 sed 's/^192.168.0.1/&localhost/' file 192.168.0.1localhost

子串匹配标记\1

匹配给定样式的其中一部分:

 echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' 
 this is 7 in a number

命令中 digit 7,被替换成了 7。样式匹配到的子串是 7,\(..\) 用于匹配子串,对于匹配到的第一个子串就标记为 \1,依此类推匹配到的第二个结果就是 \2,例如:

 echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' 
 BBB aaa

love被标记为1,所有loveable会被替换成lovers,并打印出来:

 sed -n 's/\(love\)able/\1rs/p' file

组合多个表达式

 sed '表达式' | sed '表达式'  等价于:  
 sed '表达式; 表达式'

引用

sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。

 test=hello 
 echo hello WORLD | sed "s/$test/HELLO" 
 HELLO WORLD

选定行的范围:,(逗号)

所有在模板test和check所确定的范围内的行都被打印:

 sed -n '/test/,/check/p' file

打印从第5行开始到第一个包含以test开始的行之间的所有行:

 sed -n '5,/^test/p' file

对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换:

 sed '/test/,/west/s/$/aaa bbb/' file

多点编辑:e命令

-e选项允许在同一行里执行多条命令:

 sed -e '1,5d' -e 's/test/check/' file

上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

和 -e 等价的命令是 –expression:

 sed --expression='s/test/check/' --expression='/love/d' file

从文件读入:r命令

file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:

 sed '/test/r file' filename

写入文件:w命令

在example中所有包含test的行都被写入file里:

 sed -n '/test/w file' example

追加(行下):a\命令

将 this is a test line 追加到 以test 开头的行后面:

 sed '/^test/a\this is a test line' file

在 test.conf 文件第2行之后插入 this is a test line:

 sed -i '2a\this is a test line' test.conf

插入(行上):

i\命令 将 this is a test line 追加到以test开头的行前面:

 sed '/^test/i\this is a test line' file

在test.conf文件第5行之前插入this is a test line:

 sed -i '5i\this is a test line' test.conf

下一个:n命令

如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:

 sed '/test/{ n; s/aa/bb/; }' file

变形:y命令

把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:

 sed '1,10y/abcde/ABCDE/' file

退出:q命令

打印完第10行后,退出sed sed ’10q’ file 保持和获取:h命令和G命令 在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。

 sed -e '/test/h' -e '$G' file

在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

保持和互换:h命令和x命令

互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:

 sed -e '/test/h' -e '/check/x' file

脚本scriptfile

sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

 sed [options] -f scriptfile file(s)

打印奇数行或偶数行

方法1:

 sed -n 'p;n' test.txt  #奇数行 sed -n 'n;p' test.txt  #偶数行

方法2:

 sed -n '1~2p' test.txt  #奇数行 sed -n '2~2p' test.txt  #偶数行

打印匹配字符串的下一行

 grep -A 1 SCC URFILE 
 sed -n '/SCC/{n;p}' URFILE 
 awk '/SCC/{getline; print}' URFILE

语法

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明

  • -e<script>或–expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>或–file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h或–help 显示帮助。
  • -n或–quiet或–silent 仅显示script处理后的结果。
  • -V或–version 显示版本信息。

动作说明

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

实例


首先查看testfile中的内容如下:

$ cat testfile #查看testfile 中的内容  
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 

使用sed命令后,输出结果如下:

$ sed -e 4a\newline testfile #使用sed 在第四行后添加新字符串  
HELLO LINUX! #testfile文件原有的内容  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test  
newline 

以行为单位的新增/删除

将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!

[root@www ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(后面省略).....

sed 的动作为 ‘2,5d’ ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 ” 两个单引号括住喔!

只要删除第 2 行

nl /etc/passwd | sed '2d'

要删除第 3 到最后一行

nl /etc/passwd | sed '3,$d'

在第二行后(亦即是加在第三行)加上『drink tea?』字样!

[root@www ~]# nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

那如果是要在第二行前

nl /etc/passwd | sed '2i drink tea'

如果是要增加两行以上,在第二行后面加入两行字,例如 Drink tea or ….. 与 drink beer?

[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。

以行为单位的替换与显示

将第2-5行的内容取代成为『No 2-5 number』呢?

[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
.....(后面省略).....

透过这个方法我们就能够将数据整行取代了!

仅列出 /etc/passwd 文件内的第 5-7 行

[root@www ~]# nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。

数据的搜寻并显示

搜索 /etc/passwd有root关键字的行

nl /etc/passwd | sed '/root/p'
1  root:x:0:0:root:/root:/bin/bash
1  root:x:0:0:root:/root:/bin/bash
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
4  sys:x:3:3:sys:/dev:/bin/sh
5  sync:x:4:65534:sync:/bin:/bin/sync
....下面忽略

如果root找到,除了输出所有行,还会输出匹配行。

使用-n的时候将只打印包含模板的行。

nl /etc/passwd | sed -n '/root/p'
1  root:x:0:0:root:/root:/bin/bash

数据的搜寻并删除

删除/etc/passwd所有包含root的行,其他行输出

nl /etc/passwd | sed  '/root/d'
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
....下面忽略
#第一行的匹配root已经删除了

数据的搜寻并执行命令

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'    
1  root:x:0:0:root:/root:/bin/blueshell

最后的q是退出。

数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:

sed 's/要被取代的字串/新的字串/g'
sed -i 's/^/add chnroute &/g' /opt/de_GWD/chnrouteSET #在每行首加入“add chnroute”

先观察原始信息,利用 /sbin/ifconfig 查询 IP

root@ali-qss:~# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.24.95.96  netmask 255.255.240.0  broadcast 172.24.95.255
        inet6 fe80::216:3eff:fe10:3c2e  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:10:3c:2e  txqueuelen 1000  (Ethernet)
        RX packets 53156928  bytes 18406554587 (17.1 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38893956  bytes 3821418928 (3.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
.....(以下省略).....

本机的ip是192.168.1.100。

将 IP 前面的部分予以删除

root@ali-qss:~# ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g'
172.24.95.96  netmask 255.255.240.0  broadcast 172.24.95.255

接下来则是删除后续的部分,亦即: netmask 255.255.240.0 broadcast 172.24.95.255

将 IP 后面的部分予以删除

ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/netmask.*$//g'
192.168.1.100

多点编辑

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。

直接修改文件内容(危险动作)

sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用文件 regular_express.txt 文件来测试看看吧!

regular_express.txt 文件内容如下:

[root@www ~]# cat regular_express.txt 
runoob.
google.
taobao.
facebook.
zhihu-
weibo-

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt
sed -i 's/
[root@www ~]# cat regular_express.txt 
runoob!
google!
taobao!
facebook!
zhihu-
weibo-

:q:q利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:

[root@www ~]# sed -i '$a # This is a test' regular_express.txt
[root@www ~]# cat regular_express.txt 
runoob!
google!
taobao!
facebook!
zhihu-
weibo-
# This is a test

由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增 # This is a test

 

用sed命令在行首或行尾添加字符的命令有以下几种:
假设处理的文本为test.file


在每行的头添加字符,比如”HEAD”,命令如下:
sed ‘s/^/HEAD&/g’ test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:
sed ‘s/$/&TAIL/g’ test.file
运行结果如下图:

几点说明:
1.”^”代表行首,”$”代表行尾
2.’s/$/&TAIL/g’中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了
例:

3.如果想导出文件,在命令末尾加”> outfile_name”;如果想在原文件上更改,添加选项”-i”,如(这里的-i,可以理解为其他命令执行后的结果重定向到原文件,所以-n p等参数会影响-i的效果)

4.也可以把两条命令和在一起,在test.file的每一行的行头和行尾分别添加字符”HEAD”、“TAIL”,命令:sed ‘/./{s/^/HEAD&/;s/$/&TAIL/}’ test.file
以上其实都还OK,昨天花太多时间,主要因为被处理的文件是用Mysql从数据库提取的结果导出来的,别人给我之后我就直接处理,太脑残了= -我一直有点怀疑之所以结果不对,有可能是windows和linux换行的问题,可是因为对sed不熟,就一直在搞sed。。。。。。。

众所周知(= -),window和linux的回车换行之云云,如果你知道了,跳过这一段,不知道,读一下呗:

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\n\r”。一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号。

好了,所以我的问题就出在被处理的文件的每行末尾都有^M符号,而这通常是看不出来的。可以用”cat -A test.file”命令查看。因此当我想在行尾添加字符的时候,它总是添加在行首且会覆盖掉原来行首的字符。

要把文件转换一下,有两种方法:
1.命令dos2unix test.file
2.去掉”\r” ,用命令sed -i ‘s/\r//’ test.file

###################################
二、Sed练习

1,删除文件每行的第一个字符。
sed -n ‘s/^.//gp’ /etc/passwd
sed -nr ‘s/(.)(.*)/\2/p’ /etc/passwd
2,删除文件每行的第二个字符。
sed -nr ‘s/(.)(.)(.*)/\1\3/p’ /etc/passwd

3,删除文件每行的最后一个字符。
sed -nr ‘s/.$//p’ /etc/passwd
sed -nr ‘s/(.*)(.)/\1/p’ /etc/passwd

4,删除文件每行的倒数第二个字符。
sed -nr ‘s/(.*)(.)(.)/\1\3/p’ /etc/passwd

5,删除文件每行的第二个单词。
sed -nr ‘s/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\2\3\5/p’ /etc/passwd

6,删除文件每行的倒数第二个单词。
sed -nr ‘s/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4\5\6/p’ /etc/samba/smb.conf

7,删除文件每行的最后一个单词。
sed -nr ‘s/(.*)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4/p’ /etc/samba/smb.conf

8,交换每行的第一个字符和第二个字符。
sed -nr ‘s/(.)(.)(.*)/\2\1\3/p’ /etc/passwd

9,交换每行的第一个单词和第二个单词。
sed -nr ‘s/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p’ /etc/samba/smb.conf

10,交换每行的第一个单词和最后一个单词。
sed -nr ‘s/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p’ /etc/passwd

11,删除一个文件中所有的数字。
sed ‘s/[0-9]*//g’ /etc/passwd

12,删除每行开头的所有空格。
sed -n ‘s/^\ *//p’ /etc/samba/smb.conf
sed -nr ‘s/( *)(.*)/\2/p’ testp

13,用制表符替换文件中出现的所有空格。
sed -n ‘s/\ /\t/gp’ pass

14,把所有大写字母用括号()括起来。
sed -nr ‘s/([A-Z])/(&)/gp’ testp
sed -n ‘s/[A-Z]/(&)/gp’ testp

15,打印每行3次。
sed ‘p;p’ pass

16,隔行删除。
sed -n ‘1~2p’ pass

17,把文件从第22行到第33行复制到第44行后面。
sed ‘1,21h;22h;23,33H;44G’ pass

18,把文件从第22行到第33行移动到第44行后面。
sed ’22{h;d};23,33{H;d};44G’ pass

19,只显示每行的第一个单词。
sed -nr ‘s/([^a-Z]*)([a-Z]+)([^a-Z]+)(.*)/\2/p’ /etc/passwd

20,打印每行的第一个单词和第三个单词。
sed -nr ‘s/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\2–\4/p’ /etc/passwd

21,将格式为    mm/yy/dd    的日期格式换成   mm;yy;dd
date +%m/%Y/%d |sed -n ‘s#/#;#gp’

22, 逆向输出
cat a.txt
ABC
DEF
XYZ
输出样式变成
XYZ
DEF
ABC