คำถามติดแท็ก printf

คำสั่ง shell builtin ที่จัดรูปแบบและพิมพ์ข้อมูล คำถามที่จัดการกับคำสั่ง printf หรือโดยทั่วไปโดยใช้ไวยากรณ์ printf ตามภาษาโปรแกรม (เช่น awk, PHP, perl, C ++ ... )

4
ทำไม printf ถึงดีกว่า echo
ผมเคยได้ยินว่าจะดีกว่าprintf echoฉันสามารถจำได้เพียงครั้งเดียวจากประสบการณ์ที่ฉันต้องใช้printfเพราะechoไม่ได้ทำงานเพื่อป้อนข้อความบางส่วนในโปรแกรมบางโปรแกรมใน RHEL 5.8 แต่printfทำ แต่เห็นได้ชัดว่ามีความแตกต่างอื่น ๆ และฉันต้องการสอบถามว่าพวกเขาเป็นอย่างไรและมีกรณีที่เฉพาะเจาะจงเมื่อใดที่จะใช้แบบหนึ่งกับอีกแบบหนึ่ง

2
เหตุใด printf“ umlaut” umlaut?
ถ้าฉันรันสคริปต์ง่าย ๆ ต่อไปนี้: #!/bin/bash printf "%-20s %s\n" "Früchte und Gemüse" "foo" printf "%-20s %s\n" "Milchprodukte" "bar" printf "%-20s %s\n" "12345678901234567890" "baz" มันพิมพ์: Früchte und Gemüse foo Milchprodukte bar 12345678901234567890 baz นั่นคือข้อความที่มีเครื่องหมาย umlauts (เช่นü) คือ "หด" โดยอักขระหนึ่งตัวต่อ umlaut แน่นอนฉันมีการตั้งค่าผิดบางแห่ง แต่ฉันไม่สามารถคิดได้ว่าจะเป็นแบบไหน สิ่งนี้จะเกิดขึ้นหากการเข้ารหัสไฟล์เป็น UTF-8 หากฉันเปลี่ยนการเข้ารหัสเป็น latin-1 การจัดตำแหน่งนั้นถูกต้อง แต่ umlauts แสดงผลไม่ถูกต้อง: Fr�chte und Gem�se …
54 bash  unicode  printf 

5
พิมพ์เอาต์พุตไปยัง 3 คอลัมน์แยกกัน
MYPATH=/var/www/html/error_logs/ TOTALFILE=$(ls $MYPATH* | wc -l) FILETIME=$(stat --format=%y $MYPATH* | head -5 | cut -d'.' -f1) FILE=$(ls -1tcr $MYPATH* | head -5 | rev | cut -d/ -f1 | rev) TOPLINE=$(head -1 $MYPATH* | grep -Po '".*?"' | head -5) ฉันจะพิมพ์ข้อมูล 5 ไฟล์นี้ลงในคอลัมน์ด้วยส่วนหัวได้อย่างไร? FILE CREATED TIME | FILE NAME | …

3
Awk พิมพ์ความกว้างและปัดเศษขึ้น
ฉันจำเป็นต้องprintfออกจำนวน แต่มีความกว้างที่กำหนดและโค้งมน (กับ awk!) %10s ฉันมีสิ่งนี้และอย่างใดฉันต้องเชื่อมต่อ%dแต่ทุกอย่างที่ฉันทำจบลงด้วย parametres มากเกินไปสำหรับ awk (เพราะฉันมีคอลัมน์เพิ่มเติม)
20 scripting  awk  printf 

2
เหตุใดอักขระ Unicode บางตัวจึงไม่พิมพ์ไปยังเทอร์มินัลของฉัน
ฉันกำลังเรียกใช้ Arch Linux ด้วยเทอร์มินัลอย่างง่ายโดยใช้แบบอักษร Adobe Source Code Pro LANG=en_US.UTF-8สถานที่เกิดเหตุของฉันเป็นที่ตั้งอย่างถูกต้อง ฉันต้องการพิมพ์อักขระ Unicode ที่เป็นตัวแทนการเล่นไพ่ไปยังเทอร์มินัลของฉัน ฉันใช้วิกิพีเดียสำหรับการอ้างอิง อักขระ Unicode สำหรับการ์ดทำงานได้ดี ตัวอย่างเช่นการออก $ printf "\u2660" พิมพ์หัวใจสีดำไปที่หน้าจอ อย่างไรก็ตามฉันมีปัญหากับการเล่นไพ่โดยเฉพาะ ออก $ printf "\u1F0A1" พิมพ์สัญลักษณ์Ἂ1แทนเอซโพดำ🂡 เกิดอะไรขึ้น ปัญหานี้ยังคงมีอยู่ในหลายเทอร์มินัล (urxvt, xterm, ปลวก) และตัวอักษรทุกตัวที่ฉันได้ลอง (DejaVu, Inconsolata)
16 bash  fonts  unicode  printf 

6
พิมพ์เอาต์พุตเฉพาะหลังจากค้นหารูปแบบ
มีสคริปต์ (เรียกว่าechoer) ที่พิมพ์หน้าจอเพื่อรวบรวมข้อมูลจำนวนมาก ฉันต้องการเห็นลายเส้นหลังจากพบลวดลาย ฉันนึกภาพการใช้โซลูชันเพื่อให้ดูเหมือน echoer | solution_command <pattern> เป็นการดีที่patternจะเป็นการแสดงออกปกติ แต่สตริงค่ายากจะเพียงพอสำหรับฉัน
13 echo  printf 

1
ฉันจะหยุด Bash ไม่ให้ตีความรหัสฐานแปดแทนจำนวนเต็มได้อย่างไร
ฉันกำลังเขียนสคริปต์ Horoscope RSS เป็นบทนำสู่โปรเจ็กต์ Unix / Linux และพบปัญหาศาสตราจารย์ของฉันไม่สามารถแก้ไขได้ในเวลาที่ฉันสามารถอยู่หลังเลิกเรียนได้ เนื่องจากฉันไม่สามารถหาวิธีใช้วันที่ที่แท้จริงเป็นสิ่งที่ต้องตรวจสอบฉันคิดว่าฉันลองเลขคณิตพื้นฐานโดยให้ผู้ใช้ป้อนเป็นหมายเลขมาตรฐานในรูปแบบ MMDD ตามที่เขาพูดสคริปต์ดูเหมือนว่าจะอ่านอินพุตเป็นรหัสฐานแปดแทนจำนวนเต็ม นี่คือตัวอย่างของสคริปต์: elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ] then echo "You are Sagittarius" exit elif [ "$olddate" -gt 1221 ] && [ …

6
การเติมช่องว่างที่ต่อท้ายในสตริงด้วยอักขระอื่น
ฉันต้องการส่งออกhello worldมากกว่า 20 ตัวอักษร printf "%-20s :\n\n" 'hello world!!' # Actual output hello world!! : # Wanted output hello world!!========: อย่างไรก็ตามฉันไม่ต้องการใช้ช่องว่าง แต่ใช้ " = " แทน ฉันจะทำอย่างไร
12 bash  shell  string  printf 


5
bash + using printf เพื่อพิมพ์ในรูปแบบพิเศษ
ฉันเพิ่งเขียนสคริปต์ทุบตีต่อไปนี้เพื่อตรวจสอบการเข้าถึง ping ในรายการของเครื่อง Linux: for M in $list do ping -q -c 1 "$M" >/dev/null if [[ $? -eq 0 ]] then echo "($C) $MACHINE CONNECTION OK" else echo "($C) $MACHINE CONNECTION FAIL" fi let C=$C+1 done ภาพพิมพ์นี้: (1) linux643 CONNECTION OK (2) linux72 CONNECTION OK (3) linux862 CONNECTION OK …

1
printf round แบ่งครึ่งเป็นทศนิยมแรกอย่างไร
ฉันกำลังทดสอบสองการใช้งานที่แตกต่างกันprintfในระบบของฉัน: และรุ่นที่มาพร้อมกับprintf (GNU coreutils) 8.26 zsh 5.3.1ฉันกำลังทดสอบวิธีการปัดเศษตัวเลขครึ่งหนึ่งเช่น 1.5, 2.5, 3.5, … 9.5 $ for i in {1..9}; do /usr/bin/printf '%.0f\n' "${i}.5"; done 2 2 4 4 6 6 8 8 10 $ for i in {1..9}; do printf '%.0f\n' "${i}.5"; done 2 2 4 4 6 6 8 8 10 …
11 printf  math 

4
ปรับเปลี่ยนความกว้างของคอลัมน์แรกในไฟล์ด้วยจำนวนตัวแปรที่หลากหลายโดยใช้ awk
ฉันเข้าใจวิธีใช้ฟังก์ชั่น printf ของ awk แต่ฉันไม่ต้องการระบุทุกฟิลด์ ตัวอย่างเช่นสมมติว่านี่เป็นไฟล์ของฉัน: c1|c2|c3|c4|c5 c6|c7|c8|c9|c10 c11|c12|c13|c14|c15 ฉันต้องการจัดรูปแบบเพื่อให้ทุกเขตข้อมูลแรกของระเบียนคือความกว้างของ c11 - เซลล์ที่ยาวที่สุดในเขตข้อมูลแรก: c1 |c2|c3|c4|c5 c6 |c7|c8|c9|c10 c11|c12|c13|c14|c15 ฉันเข้าใจว่าฉันสามารถระบุ: awk -F"|" '{printf "%-3s%s%s%s%s\n", $1, $2, $3, $4, $5}' file > newfile สมมติว่าฉันรู้ว่าฉันต้องการให้ความกว้างของคอลัมน์แรกเป็นอย่างไร แต่ฉันไม่ทราบว่ามีกี่ฟิลด์ในไฟล์ โดยทั่วไปฉันต้องการทำสิ่งที่ชอบ: ... '{printf "%-3s|", $1}' ... จากนั้นพิมพ์ส่วนที่เหลือของฟิลด์ในรูปแบบดั้งเดิม

3
วิธีการพิมพ์อักขระควบคุมด้วย escape sequences?
ฉันกำหนดสีแดงโดยใช้ tput red=$(tput setaf 1) เพื่อ colorize คำเตือนในโปรแกรมของฉัน ใช้งานได้ดี: printf '%sfail\n' "$red" # prints 'fail' in red แต่มีอยู่ครั้งหนึ่งที่ฉันต้องการพิมพ์ลำดับหลบหนีตามที่เป็นอยู่สิ่งที่ชอบ: \ E [31mfail ฉันจะทำสิ่งนี้ได้อย่างไร ฉันรู้ว่า printf มี%qธง แต่สิ่งอื่น ๆ ที่ฉันไม่ต้องการหลบหนี

1
ค้นหาความขัดแย้งในการเรียงลำดับ + -printf +?
ฉันต้องผ่านรายการเรียงลำดับชื่อไฟล์ FLAC ที่ยกมาให้ SoX สำหรับการต่อข้อมูล แต่ฉันมีปัญหาในการเรียงลำดับเพื่อทำงานตามที่ฉันคาดหวัง ถ้าฉันใช้: find . -maxdepth 1 -type f -iname "*.flac" | sort ฉันได้สิ่งที่ฉันคาดหวัง: ./01-Lordy.flac ./02-Both Sides Now.flac ./03-Solitary Man.flac ./04-Holly Holy.flac ./05-Cherry Cherry.flac ./06-Kentucky Woman.flac ./07-Sweet Caroline.flac ./08-Thank the Lord for the Nightime.flac ./09-And the Singer Sings His Song.flac ./10-Brother Loves Traveling Salvation Show.flac อย่างไรก็ตามฉันไม่สามารถใช้สิ่งนั้นกับสิ่งที่ฉันทำเพราะฉันต้องการรายชื่อที่เสนอโดยไม่มีบรรทัดใหม่ …
find  sort  printf 

1
วิธีการวาดเส้นแบ่งที่มีชื่อเรื่องก่อนที่จะแสดงผล
ฉันได้เขียนสคริปต์ที่แสดงชื่อและแผนกของผู้ใช้และใช้งานได้นอกจากนี้ฉันพยายามวาดเส้นแบ่งที่มีการตั้งชื่อให้กับคอลัมน์ตามที่พวกเขาต้องการ ฉันพยายามทำกับ printf แต่อย่างใดไม่สามารถรับได้ ณ ตอนนี้ .. ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม .. ด้านล่างนี้เป็นสคริปต์และผลลัพธ์ที่คาดหวัง .. #!/bin/sh for names in `cat namefile`; do DATA1="`/grid/common/bin/cod -u $names | awk -F: '/Department/ {print $2}'`" DATA2="`/grid/common/bin/cod -u $names | awk -F: '/Name/ {print $2}'`" #printf '%*s\n' "${COLUMN'S:-$(tput cols)}" '' | tr ' ' - printf "%-50s …
printf 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.