虚拟机硬盘直通挽救黑群晖数据

我这个黑群晖是1个U盘作为引导盘,一块1T硬盘安装DSM和存放数据.无法被群晖助手搜索的原因应该是安装DSM的硬盘分区出现了问题。因为我使用PE使用Diskgenius,还是可以看到这块硬盘的分区情况。如下图

经检查,这个硬盘没有发现坏道,用SMART或者DG自带的坏道检测都没查出来

个人感觉无法进入DSM的原因是硬盘系统区由于频繁快速断电导致某些文件受损,在读写的时候可能只保存了一半就断电导致文件缺失。而非硬件故障。这种情况恢复数据是很有希望的。

在无法启动DSM的情况下,我用DG把硬盘的第一个分区,也是群晖DSM的安装分区给备份后重新格式化掉,原来格式为EXT4,格式化成FAT(但是千万不要删除任何一个分区)准备重新安装DSM

但是,重新安装DSM也失败,报错无法安装此文件,文件可能已经损毁如下

其实这也是早就料到的事情,只要DSM发生损坏,不把硬盘上所有的分区都删掉的话,是无法直接安装DSM的。换句话说,黑群晖的DSM安装的时候必须挂一块空白盘。但是删除分区意味着这块盘上的所有数据都没了。

但是好处是,虽然自带DSM已经损坏,又无法安装新DSM,但是数据区的东西还是在硬盘上的,只不过因为是Linux 软 raid形式的磁盘分区,所以拆下来用Windows系统是看不了的,我们这里可以采用群晖官网的方法,制作一个Ubuntu的启动盘(和制作PE启动盘差不多),然后在linux中读取软raid分区中的数据,参考文章如下

https://www.synology.com/zh-cn/knowledgebase/DSM/tutorial/Storage/How_can_I_recover_data_from_my_DiskStation_using_a_PC

如果你打不开上面的连接,那么通过输入下面命令来读取即可

在Ubuntu的Disk工具或者PE下面的Diskgenius工具中可以看到这块硬盘的分区结构如下

第一分区安装DSM,第二个和最大那个分区就是群晖里设置的一个存储“集群”

通过这种方式,可以像开启了群晖中的终端机一样读取文件,可以在Ubuntu中把数据拷贝出来(硬盘是只读的),放到其他磁盘上去,挽救数据。

可是我现在没有那么大的硬盘把数据拷贝出来,而是想把这块硬盘插到黑群晖里继续读写数据。此时有原理相同的两种方案。

1、在一个黑群晖物理中插入至少两块硬盘,一块新硬盘,一块是我坏掉的那个,先使用USB加那个新硬盘引导并安装DSM,不要插旧硬盘,正常启动后,再插入坏掉的硬盘到SATA口上。正常启动,就可以在新的DSM中看到老硬盘中的“储存空间”和“储存集群”了。

2、在普通操作系统上装VirtualBox虚拟机,然后在虚拟机中使用两块虚拟硬盘安装DSM,正常运行后,再使用VirtualBox的物理硬盘直通方式把坏掉的硬盘转为vmdk文件,挂到虚拟机的下面。和第一种方法一样,能在新的DSM中看到原来的文件。

两种方法下,原先DSM中安装的套件,Docker容器都无法找回,只能找回原来的文件。

使用虚拟机的方法成本较低,因为只需要把坏掉的硬盘插入到随便一台比较好的机器就可以了,具体方法可以看我上一篇博客《Windows10下VirtualBox 硬盘直通设置方式》我是用的Ubuntu宿主机开的VirtualBox,因为linux下面的权限更方便调整

下面是我的VirtualBox上虚拟机的配置截图

第一块是虚拟硬盘,写入了1.04b的引导文件,第二块是用来安装DSM的,第三块是我的物理直通硬盘。

首先只插入第一块和第二块虚拟硬盘,安装全新的DSM。启动正常运行后,再插入第三块物理直通硬盘,就可以在新DSM中看到原来的文件了。由于这块硬盘原来安装了一个DSM,所以系统会提示你

原先建立的存储空间可以直接看到

存储集群也能正常看到,不过由于DSM所在分区已经损毁,会提示你“无法存取系统集群”,但是健康状态仍然为良好

虽然有红色叹号,但是并不影响我们读写原来存储的数据文件


使用File Station可读可写,跟用普通的一样。

至于套件,就相当于都卸载了,如果你之前用了moments,那么照片的实体文件还在,只是不大好找,需要开“终端机”找。同样Docker如果持久化了,那么物理文件还在,如果你原先的DSM版本和现在的DSM版本一致或者相似,那么可以去“套件中心”再下载Docker和Moments的套件,这样原先的套件和里面的内容据都恢复了。另外也可以通过docker命令行的技术把原先docker恢复出来,不过这就是另外一项高深的技术了。

下面是我恢复后的Docker套件里原来的容器,不仅还都在,而且能正常的启动,恢复dou效果非常好,同样Moments,Chat,Note Station都可以重新安装试一下,不要忘记把现在DSM的用户新建几个成为原来DSM一样名称的用户哦

下面是我恢复后的Docker原来的容器,还可以正常的启动和运行,wordpress里面的图片和文章都还在

系统配置,原来的用户、权限设定,网络设定肯定都没了,因为是新DSM了,如果你之前备份出单独文件来的话,那就非常好了。

对了,我坏掉的旧DSM版本为DSM_DS918+_24922,恢复到虚拟机的新DSM版本为DSM_DS918+_25426,小小升级了一下,引导程序都是918+的1.04b

Bing必应背景你也能有,BingBot每天更换你的电脑背景.

必应(Bing)网站每天登录都会加载一张漂亮,而且文艺气息十足的背景图片.如果能把这个背景图片设置为电脑背景,那我们也可以每天看到不同的背景了.让自己的桌面不再枯燥,于是发现一款神器.还真是用来修改电脑背景的.Windows和Mac系统都能安装.现在还在beta版.不过windows用户可以先尝尝鲜.操作十分简单.只需下载程序,双击运行即可.

这款神器叫BingBot.下载地址为:https://github.com/ser163/bingbot/releases 这个软件开放源代码,有兴趣的同学可以去看下源代码,是基于Scrapy爬虫框架开发.

GitHUB地址:https://github.com/ser163/bingbot

中文文档:https://www.ser163.cn/doc/BingBot/startbingbot.html

1.到下载页面,选择.bb_Windows.zip 然后解压到,D盘或者E盘就可以了.看到bb.exe双击一下.程序就会自动运行:

img

双击bb.exe即可运行.

2.程序会弹出运行界面,具体内容不用理会,都是scrapy的启动信息.

img

BingBot运行

3.现在我们可以看下桌面背景是不是变化了.是不是与必应 一模一样了.

img

桌面背景更换

4.是不是很方便.但是这种模式,只适合于手动运行.还可以利用Windows的定时任务计划,实现自动更换.在同一目录下.右键install.cmd.选择”以管理员身份运行”.便可以自动添加定时任务.到系统中,默认4小时运行一次.这样就可以实现自动更换桌面了.

img

添加任务计划到系统

img

任务计划

5.你可以可以更改install.cmd文件,自定义更新时间.用记事本打开.install.cmd.更改为你想要更新的时间即可.默认时间为240分钟更新一次,也就是4小时.

img

更改时间

好了.小伙伴们,经过以上设置.我们就可以每天自动实现更新背景了.现在我们的桌面也可以和必应一样文艺范十足.而且很多高清大图,美丽风景.每天都不一样.

系统内部服务 [pgsql, synoindexd] 无法启动

本人小白一枚!前几天家里的216Play消息里出现“系统事件——系统内部服务 [pgsql, synoindexd] 无法启动。请联络 Synology 支持小组以获得帮助”,同时手机端套件DS photo、DS vedio等都无法远程访问了!并且,在升级photo station、download station等套件时无法升级还会提示“此套件需要您启动 [pgsql]”。
我已将上述问题通过技术支持中心反馈给了群晖,得到了邮件回复,是通过putty登录admin账户,再sudo -i获取root权限,然后逐行输入
rm /var/services/pgsql
servicetool –set-pgsql
synoservicecfg –resume-by-reason pgsql no-volume
另实例:

ssh进去把 /volume1/@database/pgsql 重命名下,然后新建一个 pgsql 目录,用 chown 把所属用户组改成和原来相同,然后重启试试。

linux shell 命令获取字符串/文件的MD5值

字符串“hello”的MD5:

$ echo -n 'hello'|md5sum|cut -d ' ' -f1
  • 1

得到的MD5值:

5d41402abc4b2a76b9719d911017c592
  • echo -n 'admin'|md5sum|cut -d ' ' -f1
  • echo -n 'qss20180219'|md5sum|cut -d ' ' -f1

命令解释:
md5sum: 显示或检查 MD5(128-bit) 校验和,若没有文件选项,或者文件处为”-“,则从标准输入读取。
echo -n : 不打印换行符。
cut: cut用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
-d 指定与空格和tab键不同的域分隔符。-f1 表示第一个域。参考这里。

获取文件的MD5值:

$ md5sum linuxmint-12-gnome-dvd-32bit.iso|cut -d ' ' -f1
  • 1

得到的MD5值:
ee3d6e2ca498bc7685b7f17cdb5f2eea

使用MD5校验iso文件:

$ md5sum linuxmint-12-gnome-dvd-32bit.iso >linuxmint-12-gnome-dvd-32bit.md5
  • 1

注意linuxmint-12-gnome-dvd-32bit.md5的内容是:

ef3d6e2ca498bc7685b7f17cdb5f2eea linuxmint-12-gnome-dvd-32bit.iso
  • 1

把linuxmint-12-gnome-dvd-32bit和其验证文件
linuxmint-12-gnome-dvd-32bit.md5放到同一目录下用下面的命令:

$ md5sum -c linuxmint-12-gnome-dvd-32bit.md5
  • 1

如果校验正确则输出:

linuxmint-12-gnome-dvd-32bit.iso: 确定
  • 1

如果校验错误则输出:

linuxmint-12-gnome-dvd-32bit.iso: 失败
md5sum: 警告:1/1 生成的校验和不匹配
  • 1
  • 2

命令解释:
md5 -c: 从文件中读取MD5 的校验值并予以检查

Message Digest Algorithm MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)
keywords:Hash,SHA,Ronald L. Rivest,MD5,IETF(Internet Engineering Task Force)

Linux下使用MySQL教程

是最流行的关系型数据库管理系统之一,属于 Oracle 旗下产品

安装启动操作

1.安装mysql命令 :$ sudo apt-get install -y mysql-server
2.查看mysql的版本命令(注意-V是大写,不然会出现如下错误):$ mysql -V
3.启动mysql命令(关闭,重启等只需将start换成stop,restart等即可):$sudo service mysql start
4.登录mysql命令为:$ mysql -u用户名 -p密码
5.连接远程数据库:$ mysql -h <host> -P <port> -u<username> -p<password>

数据库操作

1.查看数据库:> show databases; (注意分号“;”不要落下)
2.新建一个数据库命令:> create database 数据库名称;
删除一个数据库命令:> drop database 数据库名称;
3.使用某个数据库:> use 数据库名称;

表操作

1.查看表命令:> show tables;
2.建立一个新表:> create table 表名 (字段参数); 或 >create table if not exists 表名(字段参数);
删除一个旧表:> drop table 表名; 或 >drop table if exists 表名;
3.查看表结构:> desc 表名称; 或 >show columns from 表名称;
4.对表数据的操作:
增:>insert into 表名称 (字段名1,字段名2,字段名3......) values(字段名1的值,字段名2的值,字段名3的值......);
删:>delete from 表名称 where 表达式;

建立一个新表:> create table 表名 (字段参数); 或 >create table if not exists 表名(字段参数)

删除一个旧表:>drop table 表名; 或 >drop table if exists 表名

改:>update 表名称 set 字段名=“新值” where 表达式;
查:>select 字段名1,字段名2,字段名3..... from 表名称;
5.增加字段:>alter table 表名称 add 字段名 数据类型 其它; (其它包括默认初始值的设定等等)
6.删除字段:>alter table 表名称 drop 字段名;

用户相关操作

注:以下命令均需先以root身份登录mysql:mysql -uroot -p

show databases;  显示此用户下的数据库;

use 数据库名;       切换数据库

show tables;    显示该数据库下所有表

desc users;   显示users这个表的详细信息

1.添加新用户
(1)创建新用户:> insert into mysql.user(Host,User,Password) values("localhost","user1",password("password1"));


(2)为用户分配权限:
设置用户可以在本地访问mysql:grant all privileges on *.* to username@localhost identified by "password" ;
设置用户只能访问指定数据库:grant all privileges on 数据库名.* to username@localhost identified by "password" ;
(3)刷新系统权限表:>flush privileges;
2.查看MySql当前所有的用户:>SELECT DISTINCT User FROM mysql.user;
3.删除用户及其数据字典中包含的数据:>drop user 'xbb'@'localhost';

实例:

mysql使用手册

1、mysql登录

1.1 远程登陆mysql

mysql -h ip -u root -p 密码

1.2 本地登陆mysql

mysql -u root -p 密码

2、为数据库配置远程连接权限

采用授权法

例如:以用户名:root 密码:888888从任何主机连接到mysql服务器

先在服务器上用root用户登录:

mysql –uroot –p

出现命令行提示符:

mysql>

输入:

mysql>GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’IDENTIFIED BY ‘1qaz2wsx’ WITH GRANT OPTION;

然后使配置生效:

mysql>FLUSH PRIVILEGES;

mysql>exit;

如果仅仅允许用户root 从ip为192.168.1.6的主机连接到mysql服务器,并使用888888作为密码

mysql>GRANT ALL PRIVILEGES ON *.* TO ‘root’@’192.168.1.6’ IDENTIFIED BY ‘888888’ WITH GRANT OPTION;

mysql>FLUSH PRIVILEGES ;

mysql>exit;

3、用户使用权限

mysql> use mysql;

Database changed

mysql> select host, user, password from user;

+———–+———+——————————————-+

| host      | user    | password                                  |

+———–+———+——————————————-+

| localhost | root    | *535CC5FDC76618DED475584E5F5957B9F7E63D4B |

| 127.0.0.1 | root    | *7C057B0B526E12B8D3AFBD4B9C187CA3E62DA280 |

| ::1       | root    | *7C057B0B526E12B8D3AFBD4B9C187CA3E62DA280 |

| %         | phptest | *523DF7DC12DF59EC98AD12A7125000A5B4E63721 |

| %         | root    |                                           |

| %         | mysqld  | *83D34C89B8E0F100D54C6D9276D357DB43E8779F |

| %         | server  | *866D5A029D62EC05ACC4584CE50F1CD2F50E0E82 |

+———–+———+——————————————-+

7 rows in set (0.00 sec)

4、用户登陆及密码更改

#修改当前登录用户密码:

mysql> SET PASSWORD = PASSWORD(‘1qaz2wsx’);

mysql> exit;

 

#添加ydlm用户查询、插入、更新、删除的权限:

grant select,insert,update,delete on *.* to test@”%” identified by “123456“;

grant select,insert,delete,update,create,drop on *.* to test@”%” identified by “123456”;

flush privileges;

5、限制root用户远程登陆

mysql> delete from user where user=”root” and host=”%”;

mysql> flush privileges;

mysql> exit;

#启用root用户远程登陆

mysql>GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’IDENTIFIED BY ‘1qaz2wsx’ WITH GRANT OPTION;

然后使配置生效:

mysql>FLUSH PRIVILEGES;

mysql>exit;

6、删除某用户

drop user 用户名@’%’;

drop user ydlm@’%’;

DELETE FROM user WHERE user=’test’;

或者

drop user test@”%”;

delete from user Where User=’test’ and Host=’%’; #指定用户和主机名

7、数据库导入

source /opt/test.dump_20171124_112640.sql

8、数据库的备份与恢复

— 备份数据库

— /var/lib/mysql

— 备份

— mysqldump -u 用户名 -p [密码]  [选项]  [数据库名]   [表名]  > /备份路径/备份文件名 ,选项有 –all-databases 表示备份所有数据库

mysqldump -u root -p studb > /studb.sql

mysqldump -uroot -p –all-databases >/studb.sql   #不建议用,恢复麻烦

— 还原数据库

mysql -u root -p studb < /studb.sql

9、mysql数据库使用

mysql> show databases;   查看数据库列表信息

mysql> use mysql;        USE  数据库名

mysql> show tables;

— 创建新的数据库

— CREATE DATABASE 数据库名

— 创建新的数据表

— CREATE TABLE 表名 (字段定义……)

— 删除指定的数据表

— DROP TABLE [数据库名.]表名

— 删除指定的数据库

— DROP DATABASE 数据库名

— 建表:

— create  table  student (表名称是student

— studentName  varchar(30)  not  null,   字段studentName

— studentId   int  not  null,                 字段studentId

— studentAge  int  not  null,                字段studentAge

— loginPass  varchar(10) 字段loginPass

— );

10、重置mysql数据库root用户密码

1、修改MySQL的登录设置:

vi /etc/my.cnf

在[mysqld]的段中加上一句:skip-grant-tables

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

skip-name-resolve

skip-grant-tables

2、重新启动mysqld:

/etc/init.d/mysqld restart

3、登录并修改MySQL的root密码:

/usr/bin/mysql

USE mysql ;

UPDATE user SET Password = password ( ‘new-password’ ) WHERE User = ‘root’

flush privileges ;

Quit;

4、再把配置文件修改回来,再重启服务

11、Mysql备份脚本

#!/bin/sh

# File: /root/mysql_dump/mysql_back.sh

# Database info

DB_NAME=”test”

DB_USER=”root”

DB_PASS=”123456″

# Others vars

# whereis mysqldump

# IS ` but not ‘

BIN_DIR=”/usr/bin”

BCK_DIR=”/root/mysql_dump/data”

DATE=`date +%Y%m%d_%H%M%S`

# TODO DATABASE BAK AND DELETE 15 DAYS AGO BAKFILES

mkdir -p $BCK_DIR

$BIN_DIR/mysqldump –opt -u$DB_USER -p$DB_PASS $DB_NAME \

 > $BCK_DIR/$DB_NAME.dump_$DATE.sql

find $BCK_DIR -mtime +15 -name “test.dump_*” -exec rm -rf {} \;

linu mysql数据导出来_linux下如何导入导出MySQL数据库

用mysqldump命令行

命令格式

mysqldump -u 用户名 -p 数据库名 > 数据库名.sql

范例:

mysqldump -u root -p abc > abc.sql

(导出数据库abc到abc.sql文件)

提示输入密码时,输入该数据库用户名的密码。

二、导入:

用mysql命令行

命令格式

mysql -u 用户名 -p 数据库名

三、直接COPY

如果数据库比较大,可以考虑用直接拷贝的方法,但不同版本和操作系统之间可能不兼容,要慎用。

3.1 将原始数据库用tar打包为一个文件

tar -zcvf mydb.tar.gz mydb

3.2 创建空数据库

3.3 解压

在临时目录中解压,如:

cd /tmp

tar -zxvf mydb.tar.gz

3.4 拷贝

将解压后的数据库文件拷贝到相关目录

cd mydb/

cp * /var/lib/mysql/mydb/

对于FreeBSD:

cp * /var/db/mysql/mydb/

3.5 权限设置

将拷贝过去的文件的属主改为mysql:mysql,权限改为660

chown mysql:mysql /var/lib/mysql/mydb/*

chmod 660 /var/lib/mysql/mydb/*

//——————————————————————————————————–mysqldump -u 用户名 -p 数据库名 > 导出的文件名  mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql2.mysql导出数据库一个表mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名  mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql3.mysql导出一个数据库结构mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql  -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table4.mysql导入数据库常用source 命令  进入mysql数据库控制台,  如mysql -u root -p  mysql>use 数据库  然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

mysql>source d:wcnc_db.sql

//————————————————————————————————————-

一、导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):

1、导出数据和表结构:

mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql

#/usr/local/mysql/bin/mysqldump -uroot -p abc > abc.sql

敲回车后会提示输入密码

2、只导出表结构

mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql

#/usr/local/mysql/bin/mysqldump -uroot -p -d abc > abc.sql

二、导入数据库

1、首先建空数据库

mysql>create database abc;

2、导入数据库

方法一:

(1)选择数据库

mysql>use abc;

(2)设置数据库编码

mysql>set names utf8;

(3)导入数据(注意sql文件的路径)

mysql>source /home/abc/abc.sql;

方法二:

mysql -u用户名 -p密码 数据库名 < 数据库名.sql

#mysql -uabc_f -p abc < abc.sql

注意:有命令行模式,有sql命令

Linux awk 命令

Linux 命令大全 Linux 命令大全

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

语法

awk [选项参数] 'script' var=value file(s)

awk [选项参数] -f scriptfile var=value file(s)

选项参数说明:

  • -F fs or –field-separator fs
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
  • -v var=value or –asign var=value
    赋值一个用户定义变量。
  • -f scripfile or –file scriptfile
    从脚本文件中读取awk命令。
  • -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
  • -W compact or –compat, -W traditional or –traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
  • -W copyleft or –copyleft, -W copyright or –copyright
    打印简短的版权信息。
  • -W help or –help, -W usage or –usage
    打印全部awk选项和每个选项的简短说明。
  • -W lint or –lint
    打印不能向传统unix平台移植的结构的警告。
  • -W lint-old or –lint-old
    打印关于不能向传统unix平台移植的结构的警告。
  • -W posix
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
  • -W re-interval or –re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
  • -W source program-text or –source program-text
    使用program-text作为源代码,可与-f命令混用。
  • -W version or –version
    打印bug报告信息的版本。

基本用法

log.txt文本内容如下:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

用法一:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

实例:

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 

用法二:

awk -F  #-F相当于内置变量FS, 指定分割字符

实例:

# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

用法三:

awk -v  # 设置变量

实例:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

用法四:

awk -f {awk脚本} {文件名}

实例:

 $ awk -f cal.awk log.txt

运算符

运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ 和 !~ 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ – 加,减
* / % 乘,除与求余
+ – ! 一元加,减和逻辑非
^ *** 求幂
++ — 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

过滤第一列大于2的行

$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

过滤第一列等于2的行

$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is

过滤第一列大于2并且第二列等于’Are’的行

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you

内建变量

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1         5    1
log.txt    2    2         5    2
log.txt    2    3         3    3
log.txt    2    4         4    4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1    '    1    1
log.txt    2    2    '    1    2
log.txt    2    3    '    2    3
log.txt    2    4    '    1    4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

使用正则,字符串匹配

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

~ 表示模式开始。// 中是模式。

# 输出包含 "re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

忽略大小写

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

模式取反

$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

awk脚本

关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件(学生成绩表):

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

我们的 awk 脚本如下:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

我们来看一下执行结果:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

另外一些实例

AWK 的 hello world 程序为:

BEGIN { print "Hello, world!" }

计算文件大小

$ ls -l *.txt | awk '{sum+=$5} END {print sum}'
--------------------------------------------------
666581

从文件中找出长度大于 80 的行:

awk 'length>80' log.txt

打印九九乘法表

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

更多内容:

Linux 命令大全 Linux 命令大全

1 篇笔记 写笔记

  1.    z977690557

      977***557@qq.com

    102

    awk、sed、grep更适合的方向:

    •  grep 更适合单纯的查找或匹配文本
    •  sed 更适合编辑匹配到的文本
    •  awk 更适合格式化文本,对文本进行较复杂格式处理

    关于awk内建变量个人见解,简单易懂

    解释一下变量:

    变量:分为内置变量和自定义变量;输入分隔符FS和输出分隔符OFS都属于内置变量。

    内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量。

    •  FS(Field Separator):输入字段分隔符, 默认为空白字符
    •  OFS(Out of Field Separator):输出字段分隔符, 默认为空白字符
    •  RS(Record Separator):输入记录分隔符(输入换行符), 指定输入时的换行符
    •  ORS(Output Record Separate):输出记录分隔符(输出换行符),输出时用指定符号代替换行符
    •  NF(Number for Field):当前行的字段的个数(即当前行被分割成了几列)
    •  NR(Number of Record):行号,当前处理的文本行的行号。
    •  FNR:各文件分别计数的行号
    •  ARGC:命令行参数的个数
    •  ARGV:数组,保存的是命令行所给定的各参数

    自定义变量的方法

    •  方法一:-v varname=value ,变量名区分字符大小写。
    •  方法二:在program中直接定义。

Linux 按文件列表拷贝文件到指定目录并保持原有的目录结构

当需要拷贝多个文件并且需要保留源文件的目录树结构时, 如果源目录的文件比较纯净,没有其他相关的文件或目录时, 我们只需要执行

~$ #cp -r <源目录> <新目录>
~$ cp -r workspace/project workspace/Cpp
12

但是, 如果我们需要拷贝的文件所在的目录里包含了其他项目或程序的文件或目录, 那我们就不能这么干

比如,

  • 在 /etc或者/usr/local/bin下面有很多我们自己项目的相关配置文件和程序文件, 并且我们知道这些文件路径

  • 包含指定字符串的文件名, 比如 *.log

  • 我们自己制作或者我们比较感兴趣的其他厂商的 *.deb程序包(Ubuntu使用软件包)

针对自己的项目配置文件

我们可以新建一个文本文档, 里面把我们所关心的文件列出来

list.txt

/etc/app/app.cnf
/etc/app/conf.d/a.cnf
/etc/app/conf.d/b.cnf
/etc/app/conf.d/c.cnf
/etc/app/conf.d/d.cnf
12345

这样我们就可以通过使用 cat list.txt 获取到我们的文件路径列表

此时我们只需要使用

~$ cp --parent $(cat list.txt) .
1

就可以将列表里面的所有文件按照原有的目录树结构拷贝到当前目录(或者使用其他目录)

针对包含指定字符串的文件名我们可以用 find 命令获取到文件列表

~$ find /opt/ros/ -name *.a
/opt/ros/kinetic/lib/liboctomath.a
/opt/ros/kinetic/lib/libcsm-static.a
/opt/ros/kinetic/lib/liboptions.a
/opt/ros/kinetic/lib/libegsl.a
/opt/ros/kinetic/lib/liboctomap.a
~$
1234567

然后, 嘿嘿

~$ cp --parent $(find /opt/ros -name *.a) .
1

这不就都按照源目录结构拷贝到当前目录了嘛

针对.deb包的文件列表, 我们也有命令可以获取到路径列表

~$ dpkg -L mysql-server-5.7 
/etc
/etc/mysql
/etc/mysql/mysql.conf.d
/etc/mysql/mysql.conf.d/mysqld_safe_syslog.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
/etc/mysql/debian-start
/etc/mysql/mysql.cnf
/etc/apparmor.d
/etc/apparmor.d/usr.sbin.mysqld
/etc/logrotate.d
/etc/logrotate.d/mysql-server
/etc/init.d
/etc/init.d/mysql
/etc/logcheck
/etc/logcheck/ignore.d.server
/etc/logcheck/ignore.d.server/mysql-server-5_7
/etc/logcheck/ignore.d.workstation
/etc/logcheck/ignore.d.workstation/mysql-server-5_7
/etc/logcheck/ignore.d.paranoid
/etc/logcheck/ignore.d.paranoid/mysql-server-5_7
/etc/init
/etc/init/mysql.conf
~$ 
123456789101112131415161718192021222324

linux复制指定目录下的全部文件到另一个目录中
复制指定目录下的全部文件到另一个目录中
文件及目录的复制是经常要用到的。linux下进行复制的命令为cp。
假设复制源目录 为 dir1 ,目标目录为dir2。怎样才能将dir1下所有文件复制到dir2下了
如果dir2目录不存在,则可以直接使用
cp -r dir1 dir2
即可。
如果dir2目录已存在,则需要使用
cp -r dir1/. dir2
如果这时使用cp -r dir1 dir2,则也会将dir1目录复制到dir2中,明显不符合要求。
ps:dir1、dir2改成对应的目录路径即可。

cp -r /home/www/xxx/statics/. /home/www/statics
如果存在文件需要先删除
rm -rf /home/www/statics/*
否则会一个个文件提示你确认,使用cp -rf 也一样提示

————————————–

linux下cp整个文件夹的文件到另一个文件夹
cp -ri A/B/* A1/B1/ 回车
若复制过程中询问是否覆盖,输入y按回车,若不想看到提示直接覆盖使用-rf
另外若A A1不在同一目录下,最好填绝对路径,就是/xxx/xxx/A/B/* /xxx/A1/B1/

实例:

cp -ri /home/server/tomcat/* /home/server/test/

cp: target `/home/server/test/’ is not a directory
需要先创建目标文件夹
mkdir /home/server/test

————————————–
copy命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大。
语法: cp [选项] 源文件或目录 目标文件或目录
说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。
该命令的各选项含义如下:
– a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
– d 拷贝时保留链接。
– f 删除已经存在的目标文件而不提示。
– i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
– p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
– r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
– l 不作拷贝,只是链接文件。

需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。
例1
复制指定目录下的全部文件到另一个目录中
文件及目录的复制是经常要用到的。linux下进行复制的命令为cp。
假设复制源目录 为 dir1 ,目标目录为dir2。怎样才能将dir1下所有文件复制到dir2下了
如果dir2目录不存在,则可以直接使用
cp -r dir1 dir2
即可。
如果dir2目录已存在,则需要使用
cp -r dir1/. dir2
如果这时使用cp -r dir1 dir2,则也会将dir1目录复制到dir2中,明显不符合要求。
ps:dir1、dir2改成对应的目录路径即可。
例2
复制指定文件到指定文件夹
首先建立一个用于测试的目录,用’tree’命令查看
可见,目录中主要包含用于测试的*.txt文件和用于充当炮灰的*。tes文件
目标是保持当前的目录结构,只把txt文件复制出来

方法一:当不需要的文件类型较为单一时,可以通过完全复制然后删除指定类型的文件完成
Step1 使用命令 cp -r test/ test2 将测试目录test下所有内容完全复制到test2

Step2 组合使用find及xargs,将*.tes文件删除
xargs是给命令传递参数的一个过滤器,可以将前一个命令产生的输出作为后一个命令的参数
命令find test2/ -name ‘*.tes’ |xargs rm -rf, 即将find产生的输出(test2目录下的所有tes文件),作为rm的参数,从而完全删除
适用场景举例:把项目文件备份,要去除其中的.svn文件,可以采用这种方式

方法二:需要的文件为单一类型,带目录结构复制
这种情况下可以使用tar命令将指定类型的文件打包,然后解包,同样需要组合使用find和xargs

Step1 建立目录test3
mkdir test3

Step2 将指定类型文件带目录结构打包
find test/ -name ‘*.txt’ |xargs tar czf test3.tgz

Step3 解包到目录test3
tar zxvf test3.tgz -C test3

适用场景:较为普遍,例如可以复制某个Web项目的所有html/jsp/php文件;或复制其他项目中特定类型的源文件

一、方法
列表:frp.txt
目录: /home/dir

在文件前加入cp
sed “s/^/cp /g” frp.txt >frp2.txt
在文件后加入 /home/dir
sed ‘s/$/& \/home\/dir/g’ frp2.txt> frp3.txt

以上全并成一个:
sed ‘/./{s/^/cp /;s/$/& \/home\/dir/}’ frp.txt > frp4.txt

二、方法
cp $(cat frp.txt) /home/dir
OR
cp `cat frp.txt` /home/dir

find / -name ‘frp*’ |xargs tar czf frp-dir.tgz

cp –parent $(cat list.txt) .

联想M73小主机黑苹果 篇一:黑苹果在线安装U盘制作

img

2020-08-13 11:27:43 66点赞 497收藏 114评论

很久之前一直想使用mac os系统,但是囊中羞涩,没钱买正版的,用自己的笔记本制作黑苹果,不是很完美,蓝牙无法驱动,所以放弃了,上次在B站上看到了up主:司波图的联想m73的黑苹果教程,立马去淘宝淘了一套硬件回来,组装黑苹果。

这次的黑苹果是捡垃圾,因为我并没有使用大型软件,所以看看网页,看看文档,挺好的,性能也是够用的,以下是我的配置清单

黑苹果在线安装U盘制作

淘宝购买截图

黑苹果在线安装U盘制作

主机的装机就不详细展示了,相信大家玩准系统也知道咋装。

下面开始黑苹果U盘的制作

1、下载黑苹果U盘制作工具包

下载地址:

坚果云:

[百度网盘: ](https://post.smzdm.com/p/a5k48qwk/(密码:c156)

2、安装U盘恢复镜像恢复工具

首先解压下载的工具包会得到4个文件夹

黑苹果在线安装U盘制作

打开0.安装环境文件夹,安装里面的2个软件

黑苹果在线安装U盘制作

黑苹果在线安装U盘制作

安装python的时候必须将底部的add python3.8 to PATH选项勾选上,否则无法调用。

3、下载U盘所需文件

打开1.0创建U盘文件夹

黑苹果在线安装U盘制作

进入gibMacOS-master文件夹

黑苹果在线安装U盘制作

双击gibMacOS.bat文件,会出现以下界面

黑苹果在线安装U盘制作

等待下载完成,会出现以下界面

黑苹果在线安装U盘制作

在命令框中输入r,然后回车,会出现以下选项

黑苹果在线安装U盘制作

可以用鼠标滚轮查看选项,看你的第五个选项和我上图的第五个是否一样,如果是在下面界面输入数字5,如果你的选项5和我的不一样请查找到和我上图一样的选项,并在下面界面输入对应的数字,然后回车

黑苹果在线安装U盘制作

黑苹果在线安装U盘制作

等待其下载完成即可,下载完成会出现以下界面

黑苹果在线安装U盘制作

这时,你的gibMacOS-master文件夹中会多出一个名为macOS Downloads的文件夹

黑苹果在线安装U盘制作

4、安装U盘的写入制作

进入macOS Downloads的文件夹

黑苹果在线安装U盘制作

然后点击publicrelease文件夹进入

黑苹果在线安装U盘制作

然后点击061-94461 – 10.15.6 macOS文件夹

黑苹果在线安装U盘制作

单击macOSUpd10.15.6Recovery这个文件,然后按住shift,单击右键,选择复制文件路径

然后插入U盘到电脑上

这时回到1.创建U盘->进入gibMacOS-master文件夹,双击MakeInstall.bat文件

黑苹果在线安装U盘制作

出现以下界面

黑苹果在线安装U盘制作

输入你U盘对应到数字并加上字母O并回车,此步骤会将U盘清空,请备份好U盘文件

黑苹果在线安装U盘制作

出现以下界面让你确认,这时输入小写字母y

黑苹果在线安装U盘制作

输入y后会清除你的U盘,清除过程会出现以下界面,这属于正常现象

黑苹果在线安装U盘制作

清除完毕后出现以下界面,请直接粘贴你前面复制到路径,按住键盘ctrl+v即可,然后回车

黑苹果在线安装U盘制作

黑苹果在线安装U盘制作

后面会出现以下界面,属于正常现象,在获取oc到时候可能速度会很慢,自己想办法解决,因为这是走github上下载,所以速度较慢

黑苹果在线安装U盘制作

黑苹果在线安装U盘制作

黑苹果在线安装U盘制作

黑苹果在线安装U盘制作

然后关闭对话框即可,可以在此电脑中看到多出一个名为boot到U盘,此时U盘制作已完成

这个安装u盘可以使用在任何电脑上,非联想m73的只需要将我下面的efi替换为自己机型对应版本的efi即可。

5、安装U盘的调整

进入名为BOOT的U盘中,删除里面的EFI文件夹

黑苹果在线安装U盘制作

打开2.EFI文件夹,

黑苹果在线安装U盘制作

复制里面的EFI文件夹到BOOT的U盘中

黑苹果在线安装U盘制作

黑苹果在线安装U盘制作

此时,EFI文件已经替换完成,我们还需要将EFI文件中的序列号改变,以免登陆不了你的苹果ID

打开3.修改序列号文件夹

黑苹果在线安装U盘制作

我们首先打开GenSMBIOS-master文件夹

黑苹果在线安装U盘制作

黑苹果在线安装U盘制作

双击GenSMBIOS.bat文件,出现以下命令对话框

黑苹果在线安装U盘制作

在这个对话框中输入数字3,然后回车

黑苹果在线安装U盘制作

然后出现下面对话框,在对话框中输入iMac14,1 (这里的iMac14,1一定要在英文状态下输入)

黑苹果在线安装U盘制作

然后会出现下面的序列号,这里的序列号是随机的

黑苹果在线安装U盘制作

这时,我们的将序列号生成完毕,我们现在需要修改EFI文件中的序列号了,我们打开3.修改序列号->ProperTree-master文件夹

黑苹果在线安装U盘制作

双击ProperTree.bat文件

黑苹果在线安装U盘制作

会自动出现下面界面

黑苹果在线安装U盘制作

我们点击File->Open,然后出现对话框,我们选择名为BOOT的U盘,打开EFI文件夹,选择config.plist文件,点击打开按钮

黑苹果在线安装U盘制作

会出现以下界面,

黑苹果在线安装U盘制作

我们点击Plantformlnfo前面的➕号,可以看到以下界面

黑苹果在线安装U盘制作

这时,我们将刚刚生成的序列号中的Serial复制,然后粘贴到上面界面中的SystemSerialNumber里面去,这里我们需要双击原本的序列号,将其删除然后粘贴新的序列号即可,在命令对话框中,我们选中需要复制的内容,点击右键即可复制完成

黑苹果在线安装U盘制作

按照上述方法将生成的Board Serial复制后替换MLB后面的序列号;将生成的SmUUID复制后替换SystemUUID后面的序列号即可完成所有的替换

黑苹果在线安装U盘制作

替换完成后点击File->Save,或者按ctrl+s即可保存,这是关闭软件,弹出U盘即可使用,在后面的篇2中我会讲述如何使用制作好的U盘安装macOS。

Frp内网穿透安装教程#Frpc OpenWrt客户端安装

服务端安装教程:(Frp第一篇)Frp内网穿透安装教程#Frps服务端一键安装脚本#

注意事项:在OpenWrt环境下,一定要先安装frpc客户端再安装图形操作界面 luci-app-frpc,要不就会出问题。不要问我怎么知道的,反正按着我的步骤装就好。

一、路由器安装Frp客户端Frpc,按下面的操作步骤。目前最新版本是0.33.0-1

二、路由器安装Frp图形操作界面 luci-app-frpc

1、通过ssh 登录路由器后台。并下载文件到路由器中

项目下载地址:https://github.com/kuoruan/luci-app-frpc/releases

2、安装软件

  1. #安装 luci-app-frpc
  2. opkg install luci-app-frpc_1.2.1-1_all.ipk
  3. #安装中文语言包
  4. opkg install luci-i18n-frpc-zh-cn_1.2.1-1_all.ipk

3、安装成功后Frpc图形管理界面就能在路由器的管理界面看到了。位置:路由器管理界面 -> 服务 -> Frpc

4、设置frp服务端配置

5、常规设置,按照如下配置即可。

6、最后设置内网穿透的规则即可。贴个我自己的配置,如果累心是http或者是https就不需要配置远程端口,因为在配置服务端的时候就指定好了。如果类型是TCP或UDP就要设置远程端口。