由于过去的命名行为很糟糕,我留下了一份名单,这些名单被证明是一项挑战。最重要的是,我希望将最新的名称(按日期)放在变量中。所有名称都在名为bar.txt
的文件中列出(未排序)。
在这种情况下,我无法重命名,也无法获得图像的实际日期;这些名字都是我必须继续下去的。名称可以遵循几种模式中的一种;
foo
YYYYMMDD-foo
YYYYMMDD##-foo
foo
可以是从单个字符到长字母/数字/符号的任何内容。我只对匹配第二个用例YYMMDD-foo
的名称感兴趣,因为这些名称来自我们开始标记后的一致性。
我想最终得到一个包含模式YYMMDD-foo
之后的最新日期的变量。
我知道sort -k1 -n < bar.txt
,但后来我不确定如何隔离第二个模式的结果以提取我需要的内容。
如何对文件进行排序以忽略除第二种模式之外的任何内容,并返回最新日期?
鉴于bar.txt看起来像这样;
test
2017120901-develop-BUILD-31
20170326-TEST-1.2.0
20170406-BUILD-40-1.2.0-test
2010818_001
我想提取20170406-BUILD-40-1.2.0-test
答案 0 :(得分:2)
由于您的要求涉及1)仅获取特定格式的文件2)应用排序并仅获取最新文件。我使用<?php
$dbHost = 'DBHOST';
$dbUser = 'DBUSER';
$dbPassword = 'DBPASSWORD';
$dbName = 'DBNAME';
$tables = '*';
backup_tables($dbHost,$dbUser,$dbPassword,$tables);
/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{
$db = new PDO("mysql:host=$host;dbname=$name;", $user, $pass);
//get all of the tables
if($tables == '*')
{
$tables = array();
$result = $db->query('SHOW TABLES');
$tables= $result->fetchAll(PDO::FETCH_COLUMN, 0);
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}
$return="";
//cycle through
foreach($tables as $table)
{
$return.= 'DROP TABLE IF EXISTS '.$table.';';
$result=$db->query('SHOW CREATE TABLE '.$table);
$row2 = $result->fetch(PDO::FETCH_NUM);
$return.= "\n\n".$row2[1].";\n\n";
$result = $db->query('SELECT * FROM '.$table);
foreach ($result->fetchAll(PDO::FETCH_ASSOC) as $key=>$value) {
// build query...
$return .= "INSERT INTO $table (`".implode("`, `", array_keys($value))."`)
VALUES ('".implode("', '", $value)."');\n\n";
}
$return.="\n\n\n";
}
//save file
$handle = fopen('db-backup-'.date('Y-m-d--H-i-s').'-'.(md5(implode(',',$tables))).'.sql','w+');
fwrite($handle,$return);
fclose($handle);
}
&amp; Awk
共同实现它
GNU sort
该解决方案的工作原理是仅在第一列具有与awk -F'-' 'length($1) == 8' file | sort -nrk1 | head -1
20170406-BUILD-40-1.2.0-test
对齐完全对应的8
个字符的文件中获取行。过滤后,YYYYMMDD
应用于第一个字段,第一行使用sort
获得。