{"id":37751432,"url":"https://github.com/haccht/knife","last_synced_at":"2026-01-16T14:22:27.997Z","repository":{"id":205819524,"uuid":"715170479","full_name":"haccht/knife","owner":"haccht","description":"Display only columns you specify with flexible format.","archived":false,"fork":false,"pushed_at":"2025-11-24T01:51:45.000Z","size":39,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-24T03:04:26.940Z","etag":null,"topics":["cli","command-line","terminal","tool"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/haccht.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-11-06T16:01:53.000Z","updated_at":"2025-11-24T01:51:37.000Z","dependencies_parsed_at":"2025-04-10T04:20:52.180Z","dependency_job_id":"40070bf3-b00b-4fc6-b114-66ad7d76a47c","html_url":"https://github.com/haccht/knife","commit_stats":null,"previous_names":["haccht/knife"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/haccht/knife","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haccht%2Fknife","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haccht%2Fknife/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haccht%2Fknife/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haccht%2Fknife/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/haccht","download_url":"https://codeload.github.com/haccht/knife/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haccht%2Fknife/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479393,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","command-line","terminal","tool"],"created_at":"2026-01-16T14:22:27.934Z","updated_at":"2026-01-16T14:22:27.988Z","avatar_url":"https://github.com/haccht.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# knife\n\n## Usage\n\n`knife` reads text form stdin and display only columns you specify with flexible format.\n\nUse `-F, --separator` to set the input field separators (default: whitespace).\nUse `-j, --join` to change the separator used when rejoining selected fields (default: a single space).\nUse `--buffer-size` to configure the buffered I/O size in bytes (default: 1MB) when processing very large inputs.\n\n\n``` bash\n$ cat sample.txt | knife \u003cindex\u003e\n```\n\n\n## Example\n\nUse `ps aux` as input text.\n\n```bash\n$ ps aux\nUSER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND\nroot           1  0.0  0.3 241300 13216 ?        Ss   Oct12   0:45 /lib/systemd/systemd --system --deserialize 42\nroot           2  0.0  0.0      0     0 ?        S    Oct12   0:00 [kthreadd]\nroot           3  0.0  0.0      0     0 ?        I\u003c   Oct12   0:00 [rcu_gp]\nroot           4  0.0  0.0      0     0 ?        I\u003c   Oct12   0:00 [rcu_par_gp]\nroot           5  0.0  0.0      0     0 ?        I\u003c   Oct12   0:00 [slub_flushwq]\nroot           6  0.0  0.0      0     0 ?        I\u003c   Oct12   0:00 [netns]\nroot           8  0.0  0.0      0     0 ?        I\u003c   Oct12   0:00 [kworker/0:0H-events_highpri]\nroot          10  0.0  0.0      0     0 ?        I\u003c   Oct12   0:00 [mm_percpu_wq]\nroot          11  0.0  0.0      0     0 ?        S    Oct12   0:00 [rcu_tasks_rude_]\n```\n\nSpecify a single column:\n\n```bash\n$ ps aux | knife 2\nPID\n1\n2\n3\n4\n5\n6\n8\n10\n11\n```\n\nSpecify multiple columns:\n\n```bash\n$ ps aux | knife 1 2\nUSER PID\nroot 1\nroot 2\nroot 3\nroot 4\nroot 5\nroot 6\nroot 8\nroot 10\nroot 11\n```\n\nChange the output separator with `-j` (e.g. create comma-separated output):\n\n```bash\n$ ps aux | knife 1 2 -j ,\nUSER,PID\nroot,1\nroot,2\nroot,3\nroot,4\nroot,5\nroot,6\nroot,8\nroot,10\nroot,11\n```\n\nSpecify a single column from right with the negative index:\n\n```bash\n$ ps aux | knife -1\nCOMMAND\n42\n[kthreadd]\n[rcu_gp]\n[rcu_par_gp]\n[slub_flushwq]\n[netns]\n[kworker/0:0H-events_highpri]\n[mm_percpu_wq]\n[rcu_tasks_rude_]\n```\n\nSpecify multiple columns with the range format:\n\n```bash\n$ ps aux | knife 1:2 8:10\nUSER PID STAT START TIME\nroot 1 Ss Oct12 0:45\nroot 2 S Oct12 0:00\nroot 3 I\u003c Oct12 0:00\nroot 4 I\u003c Oct12 0:00\nroot 5 I\u003c Oct12 0:00\nroot 6 I\u003c Oct12 0:00\nroot 8 I\u003c Oct12 0:00\nroot 10 I\u003c Oct12 0:00\nroot 11 S Oct12 0:00\n```\n\nSpecify multiple columns with the right open range format:\n\n```bash\n$ ps aux | knife 8:\nSTAT START TIME COMMAND\nSs Oct12 0:45 /lib/systemd/systemd --system --deserialize 42\nS Oct12 0:00 [kthreadd]\nI\u003c Oct12 0:00 [rcu_gp]\nI\u003c Oct12 0:00 [rcu_par_gp]\nI\u003c Oct12 0:00 [slub_flushwq]\nI\u003c Oct12 0:00 [netns]\nI\u003c Oct12 0:00 [kworker/0:0H-events_highpri]\nI\u003c Oct12 0:00 [mm_percpu_wq]\nS Oct12 0:00 [rcu_tasks_rude_]\n```\n\nSpecify multiple columns with the left open range format:\n\n```bash\n$ ps aux | knife :4\nUSER PID %CPU %MEM\nroot 1 0.0 0.3\nroot 2 0.0 0.0\nroot 3 0.0 0.0\nroot 4 0.0 0.0\nroot 5 0.0 0.0\nroot 6 0.0 0.0\nroot 8 0.0 0.0\nroot 10 0.0 0.0\nroot 11 0.0 0.0\n```\n\nSpecify multiple columns with the reverted range format:\n\n```bash\n$ ps aux | knife 2:1\nPID USER\n1 root\n2 root\n3 root\n4 root\n5 root\n6 root\n8 root\n10 root\n11 root\n```\n\nReorder columns:\n\n```bash\n$ ps aux | knife 2:1 3:\nPID USER %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND\n1 root 0.0 0.3 241300 13216 ? Ss Oct12 0:45 /lib/systemd/systemd --system --deserialize 42\n2 root 0.0 0.0 0 0 ? S Oct12 0:00 [kthreadd]\n3 root 0.0 0.0 0 0 ? I\u003c Oct12 0:00 [rcu_gp]\n4 root 0.0 0.0 0 0 ? I\u003c Oct12 0:00 [rcu_par_gp]\n5 root 0.0 0.0 0 0 ? I\u003c Oct12 0:00 [slub_flushwq]\n6 root 0.0 0.0 0 0 ? I\u003c Oct12 0:00 [netns]\n8 root 0.0 0.0 0 0 ? I\u003c Oct12 0:00 [kworker/0:0H-events_highpri]\n10 root 0.0 0.0 0 0 ? I\u003c Oct12 0:00 [mm_percpu_wq]\n11 root 0.0 0.0 0 0 ? S Oct12 0:00 [rcu_tasks_rude_]\n```\n\nIf you have to align columns:\n\n```bash\n$ ps aux | knife 1:8 | column -t\nUSER  PID  %CPU  %MEM  VSZ     RSS    TTY  STAT\nroot  1    0.0   0.3   241300  13216  ?    Ss\nroot  2    0.0   0.0   0       0      ?    S\nroot  3    0.0   0.0   0       0      ?    I\u003c\nroot  4    0.0   0.0   0       0      ?    I\u003c\nroot  5    0.0   0.0   0       0      ?    I\u003c\nroot  6    0.0   0.0   0       0      ?    I\u003c\nroot  8    0.0   0.0   0       0      ?    I\u003c\nroot  10   0.0   0.0   0       0      ?    I\u003c\nroot  11   0.0   0.0   0       0      ?    S\n```\n\n## Performance\n\n`knife` uses 1MB buffered I/O for both reading and writing by default (configurable via `--buffer-size`) and defers flushes until the end of the stream. This reduces syscall overhead and helps throughput when processing large datasets.\n`knife` is faster than `awk` and `cut`.\n\n\n```bash\n$ time ( cat large_file.txt | knife 1 2 3 | wc -l )\n1034472\n\nreal    0m0.497s\nuser    0m0.406s\nsys     0m0.188s\n\n\n$ time ( cat large_file.txt | awk '{print $1,$2,$3}' | wc -l )\n1034472\n\nreal    0m0.749s\nuser    0m0.703s\nsys     0m0.313s\n\n\n$ time ( cat large_file.txt | tr -s ' ' | cut -d ' ' -f 1,2,3 | wc -l )\n1034472\n\nreal    0m0.594s\nuser    0m0.906s\nsys     0m0.359s\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaccht%2Fknife","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhaccht%2Fknife","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaccht%2Fknife/lists"}