用grep查找数字范围

时间:2016-11-24 07:47:29

标签: bash shell unix grep

我有这种格式的数据库:

username:something:UID:something:name:home_folder

现在我想看看哪些用户的UID范围是1000-5000。这就是我试图做的事情:

ypcat passwd | grep '^.*:.*:[1-5][0-9]\{2\}:'

我的想法是这样的:我转到第三列并找到以1-5开头的数字开头的数字,下一个数字可以是任意数字 - 范围[0-9]并且该范围重复2次以上它是一个4位数字。换句话说,它会像[1-5][0-9][0-9][0-9]

然而,我的输出甚至列出了大于5000的UID。我做错了什么?

另外,我意识到我写的代码可能会列出最多5999的数字。如何将数字设为1000-5000?

编辑:我故意不使用awk,因为我想了解我在grep做错了什么。

2 个答案:

答案 0 :(得分:4)

你的正则表达式有几个问题:

  • 正如Sundeep在评论中指出的那样,^.*:.*:将匹配两个或更多列,因为.*部分可以匹配字段分隔符(“:”)以及现场内容。要解决此问题,请使用^[^:]*:[^:]*:(或等效地,^\([^:]:\)\{2\});请参阅下面关于括号表达式和基本与扩展RE语法的说明)
  • [0-9]\{2\}将完全匹配两位数字,而不是三位数字
  • 如您所知,它匹配以“5”开头的数字,后跟“0”以外的数字

由于这些问题,模式^.*:.*:[1-5][0-9]\{2\}:将匹配任何记录,其中UID GID的范围为100-599。

要使用grep正确执行此操作,请使用grep -E '^([^:]*:){2}([1-4][0-9]{3}|5000):'(再次参阅Sundeep的评论)。

[在编辑中添加] 关于括号表达式以及^在其中的含义,这里是re_format man page的相关部分:

  

括号表达式是用“[]”括起来的字符列表。它   通常匹配列表中的任何单个字符(但见下文)。   如果列表以'^'开头,则匹配任何单个字符(但请参阅   下面)不是列表的其余部分。如果列表中有两个字符   由' - '分隔,这是整个范围的简写   整理顺序中这两个(包括)之间的字符,   例如ASCII中的“[0-9]”匹配任何十进制数字。

(括号表达式还可以包含其他内容,如字符类和等价类,并且有关于如何包含“^”,“ - ”,“[”或“]等字符的各种特殊规则“作为角色列表的一部分,而不是否定,表示表达的范围,类别或结尾等等。实际上,这一切都相当混乱。”

关于基本扩展RE语法和扩展RE语法:grep -E使用“扩展”语法,这种语法与您混淆不同。这里的相关差异是,在基本RE中,字符“(){}”被视为文字字符,除非转义(如果转义,它们被视为表示分组和重复的RE语法);在扩展RE中,这是相反的:它们被视为RE语法,除非转义(如果转义,它们被视为文字字符)。

这就是为什么我在第一个项目符号点建议^\([^:]:\)\{2\},但实际上在建议的解决方案中使用^([^:]*:){2} - 第一个是基本语法,第二个是扩展。

另一个相关差异 - 以及我为实际解决方案进行了扩展的原因 - 只有扩展RE允许|指示备选方案,如this|that|theother(与“此”相匹配)或“那个”或“另一个”)。我需要此功能来匹配从1-4 特定数字5000([1-4][0-9]{3}|5000)开始的4位数字。在基本的RE中根本没有办法做到这一点,所以这里需要grep -E和扩展语法。

(还有许多其他RE变体,例如Perl兼容的RE(PCRE)。使用正则表达式时,请务必确定您的正则表达式工具使用哪种变体,因此您不使用它不具有的语法理解。)

答案 1 :(得分:2)

<?php 

$link = mysqli_connect("localhost", "root", "", "sts");

if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
	
if(isset($_POST['submit']))
{
	  $nama = $_POST['nama'];
          $nomkadpengenalan =$_POST['nomkadpengenalan'];
          $nomtelefon =$_POST['nomtelefon'];
	  $nomfaksimili =$_POST['nomfaksimili'];
	  $email =$_POST['email'];
	  $alamat =$_POST['alamat'];
	  $nama2 =$_POST['nama2'];
	  $harga =$_POST['harga'];
	  $usia =$_POST['usia'];
	  $asalusul =$_POST['asalusul'];
	  $pemilikasal =$_POST['pemilikasal'];
	  $keteranganringkas =$_POST['keteranganringkas'];
	  $sejarahkoleksi =$_POST['sejarahkoleksi'];
	  $lainlain =$_POST['lainlain'];
	  $panjang =$_POST['panjang'];
	  $tinggi =$_POST['tinggi'];
	  $lebar =$_POST['lebar'];
	  $berat =$_POST['berat'];
	  $diameter=$_POST['diameter'];
	
	  if (!isset($_POST['image']['tmp_name'])) {
	        echo "";
	  }else{
	        $file=$_FILES['image']['tmp_name'];
           	$image= addslashes(file_get_contents($_FILES['image']['tmp_name']));
	        $image_name= addslashes($_FILES['image']['name']);
			
			move_uploaded_file($_FILES["image"]["tmp_name"],"photos/" . $_FILES["image"]["name"]);
			
			$location="photos/" . $_FILES["image"]["name"];
		
	  }
					// attempt insert query execution
           $sql = "INSERT INTO tawarankoleksi (nama, nomkadpengenalan, nomtelefon, nomfaksimili, email, alamat, nama2, harga, usia,           asalusul, pemilikasal, keteranganringkas, sejarahkoleksi, lainlain, panjang, tinggi, lebar, berat, diameter,           gambarkoleksi) VALUES ('$nama', '$nomkadpengenalan', '$nomtelefon', '$nomfaksimili', '$email', '$alamat', '$nama2',          '$harga', '$usia', '$asalusul', '$pemilikasal', '$keteranganringkas', '$sejarahkoleksi', '$lainlain', '$panjang',          '$tinggi', '$lebar', '$berat', '$diameter', '$location')";
          if(mysqli_query($link, $sql)){
          echo "Records added successfully.";
          } else{
          echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
          }
 
           // close connection
           mysqli_close($link);
	}
?>

<div class="form-style-6">
<form action="" method="post" >
<h1>Bahagian A - Maklumat Peribadi</h1>
<p><b>NAMA : </b></p>
<input type="text" name="nama" placeholder="nama" />
<p><b>NOMBOR KAD PENGENALAN : </b></p>
<input type="text" name="nomkadpengenalan" placeholder="nom kad pengenalan" />
<p><b>NOMBOR TELEFON: </b></p>
<input type="text" name="nomtelefon" placeholder="nom telefon" />
<p><b>NOMBOR FAKSIMILI: </b></p>
<input type="text" name="nomfaksimili" placeholder="nom faksimili" />
<p><b>EMAIL: </b></p>
<input type="text" name="email" placeholder="email" />
<p><b>ALAMAT: </b></p>
<input type="text" name="alamat" placeholder="alamat" />


<h1>Bahagian B - Maklumat Artifak</h1>
<p><b>NAMA :</b></p>
<input type="text" name="nama2" placeholder="nama" />
<p><b>HARGA DITAWARKAN PEMBEKAL :</b></p>
<input type="text" name="harga" placeholder="harga ditawarkan" />
<p><b>USIA :</b></p>
<input type="text" name="usia" placeholder="usia" />
<p><b>ASAL USUL :</b></p>
<input type="text" name="asalusul" placeholder="asal usul" />
<p><b>PEMILIK ASAL :</b></br>
(Sila sertakan nama dan biografi)</p>
<textarea type="text" cols="6" rows="5" name="pemilikasal" placeholder="pemilik asal"></textarea>
<p><b>KETERANGAN RINGKAS TENTANG KONDISI DAN FIZIKAL ARTIFAK :</b></br>
(Seperti jenis bahan/motif/kegunaan)</p>
<textarea type="text" cols="6" rows="5" name="keteranganringkas" placeholder="keterangan ringkas"></textarea>
<p><b>APAKAH NILAI SEJARAH KOLEKSI :</b></p>
<textarea type="text" cols="6" rows="5" name="sejarahkoleksi" placeholder="sejarah koleksi"></textarea>
<p><b>LAIN-LAIN :</b></br>
(maklumat tambahan berkaitan jika perlu sebagai sokongan):</p>
<textarea type="text" cols="6" rows="5" name="lainlain" placeholder="lain lain"></textarea>

<table cellpadding="4" cellspacing="4">
<tr>
<p><b>UKURAN: <p><b>
<td>
<p><b>PANJANG :<b>
<input type="text" name="panjang" id="panjang" size="10" /></p>
</td>
<td>
<p><b>TINGGI :</b> 
<input type="text" name="tinggi" id="tinggi" size="10" /></p>
</td>
<td>
<p><b>LEBAR :</b>
 <input type="text" name="lebar" id="lebar" size="10" /></p>
</td>
<td>
<p><b>BERAT :</b> 
<input type="text" name="berat" id="berat" size="10" /></p>
</td>
<td>
<p><b>DIAMETER :</b>
 <input type="text" name="diameter" id="diameter" size="10" /></p>
</td>
</tr>
</table>

<h1>BAHAGIAN C - SENARAI DOKUMEN</h1>

        <p><b>1. GAMBAR KOLEKSI:</b></br>
        (Sekurang-kurangnya 300dpi format JPEG)
        <input type="file" name="image" id="image" height="500" width="500"/>
        
<h1>Bahagian D - Pengesahan / Perakuan </h1>

<p>BERDASARKAN RASA PRIHATIN DAN TANGGUNGJAWAB UNTUK MEMELIHARA WARISAN SEJARAH INI, MAKA SAYA MOHON DIPERTIMBANGKAN BAHAN-BAHAN YANG SAYA INGIN DERMAKAN INI KEPADA JABATAN MUZIUM MALAYSIA. SAYA MENGESAHKAN BAHAWA MAKLUMAT YANG DIKEMUKAN ADALAH BENAR SEPANJANG PENGETAHUAN SAYA SENDIRI. SAYA TELAH MEMBACA DAN MEMAHAMI TERMA DAN SYARAT UNTUK MENDERMA OBJEK/ARTIFAK KEPADA JABATAN MUZIUM MALAYSIA. </p>

<input type="submit" value="submit" name="submit"/>
</form>

ypcat passwd |awk -F: '$3>1000 && $3 <5000{print $1}' 这里可以用简单的方式完成任务。在这里,我们制作了&#34;:&#34;作为字段之间的分隔符,并设置第三个字段应大于1000且小于5000的条件。如果此条件满足打印第一个字段。