2014-08-27 33 views
0

我正在运行以下sed命令来编辑具有特定参数的my.cnf。然而,它需要检查和修改最后两个值,尽管它们的语法与之前修改的值没有区别,但仍然无法完成。sed无法匹配,删除然后插入

sed -i s/".*old_passwords=[0-9]*"/"# old_passwords=1"/g /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/innodb_buffer_pool_size=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\old_passwords=/ainnodb_buffer_pool_size=5G' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/innodb_additional_mem_pool_size=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\innodb_buffer_pool_size=/ainnodb_additional_mem_pool_size=100M' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/innodb_file_per_table/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\innodb_additional_mem_pool_size=/ainnodb_file_per_table' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/innodb_log_file_size=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\innodb_file_per_table/ainnodb_log_file_size=125M' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/innodb_flush_log_at_trx_commit=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\innodb_log_file_size=/ainnodb_flush_log_at_trx_commit=1' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/max_connections=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\innodb_flush_log_at_trx_commit=/amax_connections=500' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/query_cache_size=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\max_connections=/aquery_cache_size=256M' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/query_cache_type=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\query_cache_size=/aquery_cache_type=0' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/query_cache_limit=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\query_cache_type=/aquery_cache_limit=1M' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/table_cache=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\query_cache_limit=/atable_cache=256' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/thread_cache_size=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\table_cache=/athread_cache_size=4' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/innodb_flush_method=/d' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
sed -i '/\thread_cache_size=/ainnodb_flush_method=O_DIRECT' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 

最后两个值,我需要检查并设定为:

thread_cache_size=4 
innodb_flush_method=O_DIRECT 

我跑这对一个漂亮的标准my.cnf文件:

[mysqld] 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
user=mysql 
# Default to using old password format for compatibility with mysql 3.x 
# clients (those using the mysqlclient10 compatibility package). 
old_passwords=1 

max_connections=500 
innodb_buffer_pool_size=256M 

# Disabling symbolic-links is recommended to prevent assorted security risks; 
# to do so, uncomment this line: 
# symbolic-links=0 

[mysqld_safe] 
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 

产生的文件看起来像这样:

[mysqld] 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
user=mysql 
# Default to using old password format for compatibility with mysql 3.x 
# clients (those using the mysqlclient10 compatibility package). 
# old_passwords=1 
innodb_buffer_pool_size=5G 
innodb_additional_mem_pool_size=100M 
innodb_file_per_table 
innodb_log_file_size=125M 
innodb_flush_log_at_trx_commit=1 
max_connections=500 
query_cache_size=256M 
query_cache_type=0 
query_cache_limit=1M 
table_cache=256 


# Disabling symbolic-links is recommended to prevent assorted security risks; 
# to do so, uncomment this line: 
# symbolic-links=0 

[mysqld_safe] 
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 

我已经尝试删除thread_cache_size =命令,并用随机的替换,这些工作进一步发挥作用,但仍然失败,就好像它将编辑my.cnf文件的程度有限一样。

+0

所以你完全替代的'[下半年mysqld]'块?这在awk中会容易得多。你对备用解决方案感兴趣吗? (对于sed能够“读入”文件的程度,没有实际的限制。)祝你好运。 – shellter 2014-08-27 13:02:15

+0

感谢awk的提议,试图首先让我的脑袋围绕sed,而不是在遇到问题时使用别的东西。 – 2014-08-27 13:18:46

回答

1

\t在sed中有特殊含义:它代表制表符。因此,/\table_cache/永远不会匹配。

+0

谢谢,我知道这将是一件简单的事情,它仍然是一个新的。我应该能够解决如何分离\ t现在所以它不被视为特殊含义 – 2014-08-27 13:16:05

+0

@DavidDoleman:只需删除反斜杠即可。无论如何,它在'\ q'中都没有目的。 – choroba 2014-08-27 13:26:06

+0

完美的工作,从所有的行中删除了反斜杠,它可以工作。谢谢 – 2014-08-27 13:42:22

0

换一个外壳来看,是不是更好地使用这个sed的(并且仍然更好地,使用T文件作为动作列表)

sed -i 's/".*old_passwords=[0-9]*"/"# old_passwords=1"/g 
    /innodb_buffer_pool_size=/d 
    /\old_passwords=/ainnodb_buffer_pool_size=5G 
    /innodb_additional_mem_pool_size=/d 
    /\innodb_buffer_pool_size=/ainnodb_additional_mem_pool_size=100M 
    /innodb_file_per_table/d 
    /\innodb_additional_mem_pool_size=/ainnodb_file_per_table 
    /innodb_log_file_size=/d 
    /\innodb_file_per_table/ainnodb_log_file_size=125M 
    /innodb_flush_log_at_trx_commit=/d 
    /\innodb_log_file_size=/ainnodb_flush_log_at_trx_commit=1 
    /max_connections=/d 
    /\innodb_flush_log_at_trx_commit=/amax_connections=500 
    /query_cache_size=/d 
    /\max_connections=/aquery_cache_size=256M 
    /query_cache_type=/d 
    /\query_cache_size=/aquery_cache_type=0 
    /query_cache_limit=/d 
    /\query_cache_type=/aquery_cache_limit=1M 
    /table_cache=/d 
    /\query_cache_limit=/atable_cache=256 
    /thread_cache_size=/d 
    /\table_cache=/athread_cache_size=4 
    /innodb_flush_method=/d 
    /\\thread_cache_size=/ainnodb_flush_method=O_DIRECT' /home/david/systems/zabbix/2.2/2.2.5/confs/my.cnf 
相关问题