เปลี่ยนทิศทางเอาต์พุตไปที่ไฟล์จากคำสั่ง piping grep


9

ฉันกำลังทำงานนี้:

cat /dev/urandom|hexdump| grep -i "ffff f" > random

และฉันไม่ได้อะไรเลยในไฟล์randomมันยังคงมีความยาวเป็นศูนย์หลังจากคำสั่งถูกขัดจังหวะ

จะทำให้มันเขียนออกไปยังไฟล์ได้อย่างไร?

ฉันต้องเขียนผลลัพธ์ไปยังไฟล์ซึ่งควรมีข้อมูลผลลัพธ์เช่นนี้

021bc40 7724 d4f5 59ec bcbb ffff fd26 ab3c 9b7c

03a9100 b3a5 8601 fa33 ffff f23c 4326 2e7f 0c8a

0449810 e459 d5af 4e11 ffff fc55 8660 9efb 3c9b

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


14

ใช้--line-bufferedตัวเลือกสำหรับgrep(และกำจัดไร้ประโยชน์ด้วยcat):

hexdump /dev/urandom | grep --line-buffered -i "ffff f" > random

วิธีนี้เอาต์พุตไม่ได้ถูกบัฟเฟอร์ แต่ทุกบรรทัดใส่เข้าไปในrandomทันที ฉันขอแนะนำให้ใช้teeในไพพ์ของคุณเพื่อดูว่ามีการผลิตหลายบรรทัด:

hexdump /dev/urandom | grep --line-buffered -i "ffff f" | tee random

3

ไฟล์ของคุณว่างเปล่าเนื่องจากกระบวนการถูกขัดจังหวะก่อนที่ไฟล์จะถูกเขียนลงดิสก์ นั่นคือวิธีการเปลี่ยนเส้นทางทำงาน โปรดลองวิธีนี้:

script -c 'cat /dev/urandom|hexdump|grep -i "ffff f"' -f random

โดยทั่วไปจะเขียนผลลัพธ์หน้าจอทั้งหมดลงในไฟล์


มันเกี่ยวข้องกับคำสั่งอีกหนึ่ง แต่ส่ง ขอบคุณ.
Ruslan Gerasimov

3

cat /dev/urandom|hexdumpหรือhexdump /dev/urandomเขียนต่อเนื่องไปยัง stdout และหากคุณกดCtrl+ Cจะไม่มีการดำเนินการใด ๆ หลังจากนี้ แต่คุณสามารถ จำกัด เอาท์พุทด้วยhead

hexdump /dev/urandom | head -n1000000 | grep "ffff f" > random  

สิ่งนี้จะgrepอยู่ในบรรทัดแรก 1000000 บรรทัดของเอาต์พุตและเขียนผลลัพธ์ไปยังไฟล์


เกี่ยวข้องกับอีกหนึ่งคำสั่ง แต่ให้ผลลัพธ์ที่ดี ขอบคุณ.
Ruslan Gerasimov

1

คุณจะต้องเขียนผลลัพธ์ของcat /dev/urandom | hexdumpไฟล์ก่อนที่จะดำเนินการในครั้งต่อไป สคริปต์ด้านล่างควรบรรลุสิ่งที่คุณพยายาม:

cat /dev/urandom | hexdump |
  while IFS= read -r line; do
    printf '%s\n' "$line" >> random;
  done

IFS ใช้เพื่อแยกเอาต์พุตเป็นบรรทัดที่นี่


(ที่มา)


grep "ffff f"พลาด
Ruslan Gerasimov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.